2015-03-09 2 views
0

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

#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; 
} 
+1

Скомпилируйте исходный код еще раз. Но на этот раз включите отчет об ошибках (попробуйте добавить '-Wall' в командную строку). Вы увидите длинный список ошибок в исходном коде. Исправьте их. –

ответ

0

НКУ -Wall -ansi -pedantic

Во-первых, вы, вероятно, не следует возвращать статический Int. Возвращает либо char, либо int или unsigned int.

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

Линия 28:

push(atof(*argv)); 

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

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

Это требует массива стека [макс], указателя Int и другого Int указателя

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

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

Смежные вопросы