c- ошибка калькулятора обратной польской нотации

Поэтому я продолжаю получать сообщение о недопустимом выражении "...". Ошибка шины (ядро сброшено), если я набираю ./rpcalc "...", также, если я просто набираю в командной строке ./rpcalc 1, я получаю ошибку сегментации (ядро сброшено) сообщение. Это весь мой код, я был бы признателен за любую помощь.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define max 10
#define NUMBER 'n'



int main(int argc, char *argv[])
{
  double tmp;
   char c;

  if(argc <= 1) {
    fprintf(stderr,"invalid call\n");
    return 1;
  }

    while(--argc)
       {
         c = getop(*++argv);
        switch(c)
          {
         case NUMBER:
          push(atof(*argv));
          break;
         case '+':
          push(pop() + pop());
          break;
         case '-':
          tmp = pop();
          push(pop() - tmp);
          break;
         case '*':
          push(pop() * pop());
          break;
         case '/':
          tmp = pop();

          if(!tmp){
          printf("can't divide by 0\n");
          }
          else{
          push(pop()/tmp);
          }
          break;
         default:
           printf("invalid expression %s\n", *argv);
         }
      }
    printf("%g\n",pop());
    return 0;
}


int push (int stack[max], int *top, int *data)
{
 if(*top == max -1)
    return(-1);
  else
    {
      *top = *top +1;
      stack[*top] = *data;
      return(1);
    }
}

int pop(int stack[max], int *top, int *data)
{
  if(*top == -1)
    return(-1);
  else
    {
      *data = stack[*top];
      *top = *top - 1;
      return(1);
    }
}

 static int isNumber(const char *s){
  if(*s == '-' || *s == '+') s++;
  if(*s == '\0'){
    return 0;
  }

  while (isdigit(*s)) s++;

  if(*s == 'e' || *s == 'E'){
    s++;
    while(isdigit(*s)) s++;
  }
  return *s == '\0';
}

int getop(const char *op){
  return isNumber(op) ? NUMBER : *op;
}

person Sgt. Sideburns    schedule 09.03.2015    source источник
comment
Снова скомпилируйте исходный код. Но на этот раз включите отчеты об ошибках (попробуйте добавить -Wall в командную строку). Вы увидите длинный список ошибок в исходном коде. Сначала исправьте их.   -  person r3mainer    schedule 09.03.2015


Ответы (1)


gcc -Wall -ansi -педантичный

Во-первых, вы, вероятно, не должны возвращать static int. Возвращает либо char, либо int, либо unsigned int.

Далее: Вы вызываете функции с неверными параметрами:

Строка 28:

push(atof(*argv));

Это не то, как вы определили свою функцию.

int push (int stack[max], int *top, int *data);

Требуется массив stack[max], указатель int и еще один указатель int

Передача в поплавок не является правильным.

На самом деле похоже, что все ваши вызовы функций имеют неверные параметры.

person jake    schedule 09.03.2015