IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Ошибка сегментирования, язык C
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 56
Пол: Мужской

Репутация: -  2  +


Хочу написать програмку-калькулятор (по книге Кернигана и Ритча).
Суть простая: вводится выражение в форме обратной польской нотации, оно вычисляется и выводится результат.

Программу разбил на функции:

1) GetLine - получение строки (работает нормально).
2) calculate - вычисление и получение результата, вот тут проблема, при входе в функцию появляется та самая ошибка сегментирования.
3) getop - получение следующего элемента из строки. (тоже самое).
4) pop и push - работа со стеком. (работают тоже не правильно, но по крайней мере из-за них программа не вылетает).

Компилятор GCC.

calculate (Показать/Скрыть)

getop (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Еще 2 ошибки:

1) перед тем, как заталкивать число в стек, надо отсечь весь мусор в строке. Это очень просто:
   else if ( ( expr[i] == ' ' || expr[i] == '\t' ) && i > 0 )
{
op[j] = '\0'; /* Вот и все, теперь atof будет воспринимать только число, до позиции j */
push (atof(op));
return NUMBER;
}


2) более серьезный просчет:
 static int i; /* Я так понимаю, это чтобы i сохранялось между вызовами? */
int j;
char op[10];
putchar ('.');
for (i = 0, j = 0; expr[i] != '\0' || expr[i] != '\n' || expr[i] != '='; i++) /* <--- Вот сюда теперь посмотри */

Именно для этого ты описал i статической? Чтобы при втором заходе в getop() все, что уже было прочитано из строки, пропускалось, и читалось со следующего символа? Не получится, ты в начале цикла переменную i обнуляешь, то есть при самом удачном раскладе ты получишь зацикливание, будешь все время читать только первый токен из строки (о чем тебе и говорит gdb). Применяй какой-нибудь другой способ для подобных трюков...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.05.2024 5:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name