Błąd przy obsłudze stosu.

0

Cześć. Mam kalkulator odwrotnej notacji polskiej na stosie (lista dynamiczna jednokierunkowa). Nie działa jednak poprawnie. Wydaje się, że funkcja pop została przeze mnie źle napisana, ale nie wiem gdzie jest błąd.


    typedef struct elem{
    int dana;
    struct elem *nast;
    }t_elem, *pom;

Program rozpoznaje, czy na wejściu pojawiła się liczba czy znak operacji.
Jeśli był np. znak minusa, idziemy do:

 void przetwarzaj_opcje(char *wej,t_elem *stos){
                 ...
               case '-':
              dzialanie(&stos, '-');
              break;
              ...

A następnie:

 void dzialanie (t_elem ** stos, char dzialanie){
  int tmp1, tmp2, wynik;
  tmp1=pop(stos); /*zapisujemy sobie 2 liczby ze szczytu stosu zeby mozna bylo na nich dzialac*/
  tmp2=pop(stos); /*tu dodam obsluge błędu, gdy na stosie będzie tylko jedna liczba*/
  switch (dzialanie){   /*i teraz w zaleznosci od operatora robimy z nimi co trzeba*/
  case '-':
    wynik=tmp1-tmp2;
    push(stos, wynik);
    break;

Funkcja pop wygląda tak:

 int pop(t_elem ** stos) {
      t_elem *pomoc;
      int wartosc;
      if (*stos==NULL){
      printf ("Stos pusty!\n");
      return 0;
     }

   else {
     pomoc = *stos;
     wartosc = pomoc->dana;
     *stos = pomoc->nast;  
     free(pomoc);
     return wartosc;
                    }

    }

Przykład problemu: na stosie mam:
5
4
7

Wpisuję znak '-':
na stosie mam:
0
1
7
Teraz gdy próbuję cokolwiek zrobić, pojawia się komunikat o błędzie ochrony pamięci (core dumped).
Problemem jest funkcja pop (nie mogę zdjąć więcej niż jednego elementu), która zostawia na szczycie stosu to '0', będące najpewniej NULLem. Nie wiem gdzie jest błąd. Pokażę jeszcze funkcję push, która jednak, wydaje mi się, działa poprawnie, bo wynik zostaje odłożony na stos poprawnie:

     void push (t_elem **stos, int wartosc){

            t_elem *pom=malloc(sizeof(t_elem));     
            pom->dana=wartosc;
            pom->nast=*stos;
            *stos=pom;
    }

Kompilacja: gcc rpn.c -Wall -pedantic
nie zwraca żadnych błędów.

Dziękuję za przeczytanie tematu, proszę o wskazówki dot. rozwiązania problemu.

1
  1. wynik=tmp2-tmp1;
  2. przetwarzaj_opcje(char *wej,t_elem **stos)
  3. dzialanie(stos, '-');
  4. przy wywołaniu przetwarzaj_opcje już musisz podać adres tego wskaźnika który będziesz później wyświetlać.
0

Dziękuję bardzo, program działa poprawnie.
Dzięki też za uwagę 1. W całym kodowaniu nie zwróciłem uwagi na tę istotną sprawę, że wykonuję działania nie w takiej kolejności, jak trzeba. Dzięki jeszcze raz!

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0