1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Хочу написать програмку-калькулятор (по книге Кернигана и Ритча). Суть простая: вводится выражение в форме обратной польской нотации, оно вычисляется и выводится результат.
Программу разбил на функции:
1) GetLine - получение строки (работает нормально). 2) calculate - вычисление и получение результата, вот тут проблема, при входе в функцию появляется та самая ошибка сегментирования. 3) getop - получение следующего элемента из строки. (тоже самое). 4) pop и push - работа со стеком. (работают тоже не правильно, но по крайней мере из-за них программа не вылетает).
Компилятор GCC.
calculate(Показать/Скрыть)
double calculate (char expr[]) {
char type; double op2;
printf ("Начало вычисления"); // я это специально здесь поставил, но до этого места даже не доходит.
while ( ( type = getop(expr) ) != EOE ) switch ( type ) { case NUMBER: ; break; case '+': push (pop() + pop()); break; case '-': op2 = pop(); push (pop() - op2); break; case '*': push (pop() * pop()); break; case '/': if ( (op2 = pop()) != 0.0) push (pop() / op2); else printf ("Ошибка: деление на нуль.\n"); break; default: printf ("Ошибка: неизвестная операция.\n"); break; }
return pop();
}
getop(Показать/Скрыть)
int getop (char expr[]) {
static int i; /* getop будет возвращать найденную операцию или NUMBER если найдено число, потом после того как calculate выполнит необходимые действия работа будет продолжена там, где остановилась.*/ int j; char op[10];
На предупреждения компилятора внимание не хочешь обратить?
\home\volvo\Devel\c_tst\main.c|14|warning: return type defaults to 'int'| \home\volvo\Devel\c_tst\main.c||In function 'getop':| \home\volvo\Devel\c_tst\main.c|86|warning: suggest parentheses around assignment used as truth value| \home\volvo\Devel\c_tst\main.c|93|warning: multi-character character constant| \home\volvo\Devel\c_tst\main.c|95|warning: implicit declaration of function 'atof'| \home\volvo\Devel\c_tst\main.c||In function 'pop':| \home\volvo\Devel\c_tst\main.c|42|warning: control reaches end of non-void function| ||=== Build finished: 0 errors, 5 warnings (0 minutes, 0 seconds) ===|
В 86 строке однозначная ошибка:
else if ( expr[i] == '.' && j > 0 ) /* у тебя был один знак "=" */
, то же самое касается и 93 строки:
else if ( ( expr[i] == ' ' || expr[i] == '\t' ) && i > 0 ) /* у тебя был обычный слэш, нужен обратный */
И это, покажи, какую ты строку вводишь для теста...