Error in xcode

Dear forum members,

I have an error saying All paths through this function will call itself at line 137 when the code is run in Xcode. Please look what might be wrong. The code is below.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
//
//  main.cpp
//  13
//
//  Created by Aurimas on 15/01/2019.
//  Copyright © 2019 Aurimas. All rights reserved.
//

#include <iostream>
#include <cmath>
#include <cstdlib>
#include "simpson.h"
#include "pratimas13_f1.h"
#include "pratimas13_f2.h"

// deklaruoju pagalbines funkcijas
void text();
void spresti_funkcija(double (*funk) (double x));
char setchar(void);
void clear(void);
int minimeniu(void);

int main()
{
// hack'as: kad visada butu panasiai centruotas menu
// pirma atspausdinu tusciu liniju
clear();
text();

for (;;)
{
    char r = setchar();
    switch(r)
    {
        case 'x':
        {
            return 0;
        }
        case 'c':
        {
            clear();
            text();
        }
        case 'f':
        {
            int a = 1;
            while(a)
            {
                spresti_funkcija(f1);
                printf("\n");
                // 1 arba 0
                a = minimeniu();
                printf("\n");
            }
            
            clear();
            text();
            break;
        }
            
        case 's':
        {
            int a = 1;
            while(a)
            {
                spresti_funkcija(f2);
                printf("\n");
                // 1 arba 0
                a = minimeniu();
                printf("\n");
            }
            
            clear();
            text();
            break;
        }
            
        default:
        {
            printf("\n\n");
        }
    }
  }
}

// ***********************************************

void text()
    {
    printf("Meniu \r\n\n");
    printf("Kokią funkciją norite integruoti?\n");
    printf("f(x) = x - spauskite f\n");
    printf("f(x) = x^2 - spauskite s\n");
    printf("Išeiti iš meniu - spauskite x\n");
    for (int i = 1; i < 5; i++)
        printf("\n");
    }

// ********************************************
    
void spresti_funkcija(double (*funk) (double x))
{
    double a,b,f;
    int n;
        
    // Duomenys -------------------------------
    
    printf("a = ");
    
    // a, b, n jau deklaruoti, scanf reikia zinoti tik jo adresa
    
    scanf("%lf", &a);
        
    printf("b = ");
    scanf("%lf", &b);
        
    printf("n = ");
    scanf("%d", &n);
        
    // isvalo nuo susikaupusio "return" zenklo stinput
    while (getchar() != '\n');
        
    // ----------------------------------------
        
    f = simpson(funk,a,b,n); // Integralas
        
    // Rezultatas -----------------------------
        
    printf("Integralas = %.3lf\n",f);
}
    
    // ********************************************
char setchar(void)
    // only get the first char
    // using it consistently throughout the code
    // will prevent the issue of reading "return"
{
    char c = setchar();
    while (setchar() != '\n');
    return c;
}
    
    // ********************************************
void clear(void)
    // hack to "clear" screen by printing empty lines
{
    for (int i = 0; i < 100; i++)
    {
        printf("\n");
    }
}

    // ********************************************
    
int minimenu(void)
// require the user to either enter 'x' or 'p'
// returns 0 or 1, respectively
{

    for (;;)
    {
        printf("p - Spreskite funkcija \n x - Atgal i meniu \n");
        char c = setchar();
            
            
        switch(c)
        {
            case 'p':
                return 1;
                break;
                    
            case 'x':
                return 0;
                break;
                    
        }
    }
}
Last edited on
The main() function body must be enclosed in curly brackets.
At line 138, the first statement of setchar() is a call to setchar(). That call will hit like 138 which will call setchar() and so on and so on until you exceed the size of the stack.
Thank you. How could I fix this problem with setchar(), any suggestions?
Instead of calling setchar inside setchar you probably want to call some other function that reads one character.

The name "setchar" seems a bit confusing to me because it's more of a "get" function than a "set" function.
Yeah. That's true I'll change the name to getchar. Do I need o create another function that reads one character cause I thought it should work the way I've written with setchar()?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <cctype>

// get the first character in from a line and discard the rest of the line
char get_first_char()
{
    std::string line ;
    std::getline( std::cin, line ) ;

    // return the first non-space character
    for( char c : line ) if( !std::isspace(c) ) return c ;

    return get_first_char() ; // empty line or only spaces; try again
}

int main() // minimal test driver
{
    char c ;
    while( ( c = get_first_char() ) != 'q' ) std::cout << "first char: " << c << '\n' ;
}
I thought it should work the way I've written with setchar()?

You have an infinite recursion. You call setchar(), which calls setchar(), which calls setchar(), which calls setchar(), which calls setchar(), and so on...
Topic archived. No new replies allowed.