Как исправить ошибку сегментации при попытке сделать RPN в C - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь создать программу, которая будет использовать RPN, которая будет вычислять последовательность целых чисел. У меня есть некоторые стандартные функции (pop, push), которые я не могу изменить. Но когда я запускаю приведенный ниже код, я получаю ошибку сегментации.

Поскольку я не могу изменить внутреннее ядро ​​этих двух функций, я попытался изменить способ их вызова (я сделал stack[] динамический массив и top указатель int), но ничего не изменилось .

#include <stdio.h>
#include <stdlib.h>
#define N 1000

void push(int stack[],int *t,int obj)
{
    if((*t)==(N-1))
    {
        printf("Stack overflow...\n");
        getchar(); //getc
        abort();
    }
    else
        stack[++(*t)]=obj;
}

int pop(int stack[],int *t)
{
    int r;
    if((*t<0))
    {
        printf("Stack empty...\n");
        printf("Error in expresion.\n");
        getchar(); //getc
        abort();           
    }
    else
        r=stack[(*t)--];
    return(r);
}

int isdigit(char in)
{
    int flag;

    if (in>=48 && in<=57)  //if its terminus 
        flag=1;
    else if(in==42 || in==43 || in==45 || in==47) //if its  operator
        flag=2;
    else 
        flag=0;

    return flag;
}

int main(int argc, char** argv) {

    int *stack=(int*) malloc(N*sizeof(int));
    char input;
    int i=0,*top=0,flag;
    int num1,num2;
    float result;

    if (stack == NULL) {
        printf("Out of memory!\n");
        return (1);
    }  
    printf("Give the Formula: ");
    while(input=getchar())
    {
        flag=isdigit(input);
        if(flag==1) //if its terminus 
        {
            push(&stack[i],top,input);
        }
        if(flag==2) //if its enforcer
        {
            num1=pop(&stack[i],top);
            num2=pop(&stack[i+1],top);
            if (input==42)   //case of +
                result=num1+num2;
            if (input==43) //case of *
                result=num1*num2;
            if (input==45) //case of -
                result=num2-num1;

            if (input==47) //case of /
                if(num2!=0) 
                    result=num2/num1;
                else
                    printf("Can't do the operation");
            push(&stack[i],top,result);
        }
        if(flag==0)  //case of everything else
        {
            printf("Error");
            exit(1);
        }
        printf("Operand: %c\n",input);
        //  for(int j=0;j<strlen(stack);j++)
        //   printf("stack[%d]=%d\n",i,stack[j]);
        //printf current status of stack

        i++;
    }   
    return (EXIT_SUCCESS);
}

Если у вас есть ряд целых чисел, таких как 234+*, стек должен быть, во-первых, 2,3,4,+,*, во-вторых 5,4,*, в-третьих 20.

1 Ответ

1 голос
/ 13 мая 2019

В main вы определили top как указатель и инициализировали его, чтобы он указывал на ноль.

После этого в push вы пытаетесь разыменовать нулевое местоположение с помощью *t.Здесь вы получаете ошибку сегментации.

...