Błąd przy obsłudze stosu.

Błąd przy obsłudze stosu.
VA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
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.

Kopiuj
     
    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:

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

A następnie:

Kopiuj
 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:

Kopiuj
 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:

Kopiuj
     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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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ć.
VA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
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!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.