![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Игорь |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 56 Пол: Мужской Репутация: ![]() ![]() ![]() |
Хочу написать програмку-калькулятор (по книге Кернигана и Ритча).
Суть простая: вводится выражение в форме обратной польской нотации, оно вычисляется и выводится результат. Программу разбил на функции: 1) GetLine - получение строки (работает нормально). 2) calculate - вычисление и получение результата, вот тут проблема, при входе в функцию появляется та самая ошибка сегментирования. 3) getop - получение следующего элемента из строки. (тоже самое). 4) pop и push - работа со стеком. (работают тоже не правильно, но по крайней мере из-за них программа не вылетает). Компилятор GCC. calculate (Показать/Скрыть)
getop (Показать/Скрыть)
|
![]() ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Еще 2 ошибки:
1) перед тем, как заталкивать число в стек, надо отсечь весь мусор в строке. Это очень просто: else if ( ( expr[i] == ' ' || expr[i] == '\t' ) && i > 0 ) 2) более серьезный просчет: static int i; /* Я так понимаю, это чтобы i сохранялось между вызовами? */ Именно для этого ты описал i статической? Чтобы при втором заходе в getop() все, что уже было прочитано из строки, пропускалось, и читалось со следующего символа? Не получится, ты в начале цикла переменную i обнуляешь, то есть при самом удачном раскладе ты получишь зацикливание, будешь все время читать только первый токен из строки (о чем тебе и говорит gdb). Применяй какой-нибудь другой способ для подобных трюков... |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 12:55 |