Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - ERRORE DI SEGMENTAZIONE AIUTO!!!
Forum - C/C++ - ERRORE DI SEGMENTAZIONE AIUTO!!!

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Da qualche giorno mi sto picchiando con questo programma per la trasformazione di un'espressione in notazione infissa in un'espressione in notazione postfissa....
L'algoritmo funziona però mi da un'errore di segmentazione e nn capisco dove abbia sbagliato anche perchè la stessa pila su un altro prog va??? :d
qualcuno può darmi una mano???
io intanto posto il codice l'errore penso che sia alla riga 36  
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define SIZE 100
  4.  
  5. typedef struct _node{
  6.    char value;
  7.    struct _node *next;
  8. } node;
  9.  
  10. typedef node *nodePrt;
  11.  
  12. void convert( char infix[ SIZE ], char postfix[ SIZE ] );
  13. void ins( nodePrt *pila, char val );
  14. char del( nodePrt *pila );
  15. int priority( char a, char b );
  16. int isOperator( char a );
  17.  
  18. void convert( char infix[ SIZE ], char postfix[ SIZE ] )
  19. {
  20.    int k, i;
  21.    nodePrt pila = NULL;
  22.    
  23.    ins( &pila, '(' );
  24.    for( k = 0; infix[ k ] != '\0' ; k++ );
  25.    infix[ k ] = ')';
  26.    infix[ k + 1 ] = '\0';
  27.    
  28.    for( k = 0, i = 0; infix[ k ] != '\0'; k++)
  29.    {
  30.       if( infix[ k ] == '(' )
  31.          ins( &pila, infix[ k ] );
  32.       if( isdigit( infix[ k ] ) )
  33.          postfix[ i++ ] = infix[ k ];
  34.       if( isOperator( infix[ k ] ) ){
  35.          while( priority( pila->value, infix[ k ] ) >= 0 )
  36.       {
  37.          postfix[ i++ ] = del( &pila );
  38.       }
  39.       ins( &pila, infix[ k ] );
  40.       }
  41.       if( infix[ k ] == ')' ){
  42.          while( pila->value != '(' )
  43.             postfix[ i++ ] = del( &pila );
  44.          del( &pila );
  45.       }
  46.  
  47.    }
  48.    postfix[ i ] = '\0';
  49. }
  50.  
  51. int main(){
  52.    char string[ SIZE ] = "96 + 2";
  53.    char alpha[ SIZE ];
  54.    convert( string, alpha );
  55.    printf("%s", alpha );
  56. }
  57.  
  58. void ins( nodePrt *pila, char val )
  59. {
  60.    nodePrt newNode = malloc( sizeof( node ) );
  61.    newNode->next = *pila;
  62.    newNode->value = val;
  63.    *pila = newNode;
  64. }
  65.  
  66. char del( nodePrt *pila )
  67. {
  68.    if( *pila != NULL )
  69.    {
  70.       nodePrt temp;
  71.       char val;
  72.      
  73.       temp = *pila;
  74.       *pila = temp->next;
  75.       val = temp->value;
  76.       free( temp );
  77.       return val;
  78.    }
  79.    else
  80.       printf("Pila vuota \n");
  81. }
  82.  
  83. int isOperator( char a )
  84. {
  85.    if( a == '+'|| a== '-'|| a == '*'|| a== '/')
  86.       return 1;
  87.    else
  88.       return 0;
  89. }
  90.  
  91.  
  92. int priority( char a, char b )
  93. {
  94.    int ap, bp;
  95.    switch( a )
  96.    {
  97.       case '-':
  98.       case '+':
  99.          ap = 0;
  100.          break;
  101.       case '*':
  102.       case '/':
  103.          ap = 1;
  104.          break;
  105.       case '(':
  106.       case ')':
  107.          ap = 2;
  108.          break;
  109.    }
  110.    switch(b )
  111.    {
  112.       case '-':
  113.       case '+':
  114.          bp = 0;
  115.          break;
  116.       case '*':
  117.       case '/':
  118.          bp = 1;
  119.          break;
  120.       case '(':
  121.       case ')':
  122.          bp = 2;
  123.          break;
  124.    }
  125.    return ap - bp;
  126. }


grazie in anticipo per l'aiuto....
Bond

Ultima modifica effettuata da il 06/02/2008 alle 14:56
PM Quote
Avatar
Babel (Normal User)
Newbie


Messaggi: 5
Iscritto: 07/02/2008

Segnala al moderatore
Postato alle 17:09
Giovedì, 07/02/2008
Se ho contato bene la linea è:
Codice sorgente - presumibilmente Plain Text

  1. while( priority( pila->value, infix[ k ] ) >= 0



Gli errori di segmentazione avvengono quando tratti un certo tipo come se fosse un altro tipo... come trattare un puntatore a int come un puntatore a una struttura ecc. In C per come è fatto il linguaggio sono molto molto frequenti... ^^
Il compilatore non li segnala poiché non sono errori sintattici, sono errori concettuali, quindi il compilatore non può sapere se hai sbagliato.
Con tutta probabilità o pila non è un puntatore alla struttura giusta o k va oltre l'indice massimo di infix...
Sono sempre abbastanza noiosi da trovare questi errori... è utile usare il debugger per trovare gli errori più in fretta.

Buon lavoro! Sono il bello del C i segmentation fault :D

Edit: il fatto che su un altro compilatore il programma non crashi... è un caso, se non funziona su uno dei due hai fatto un errore nel codice e il fatto che uno dei due compilatori te lo dia ok è un caso (almeno... a me a volte è capitato)

Ultima modifica effettuata da Babel il 07/02/2008 alle 17:11
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:33
Giovedì, 07/02/2008
Grazie x i ragguagli il problema è che nn riesco a trovarlo sto benedetto errore è alla riga dopo quella k hai indicato tu...
pensavo che fosse un problema della pila ma qualla su un altro programma va!! baf se qualcuno lo trova me lo dica
graz

PM Quote
Avatar
Babel (Normal User)
Newbie


Messaggi: 5
Iscritto: 07/02/2008

Segnala al moderatore
Postato alle 20:45
Giovedì, 07/02/2008
Se vuoi un consiglio da amico non postare mai richieste così, sono le classiche domande che su forum non avranno mai risposta... ^^
Salvo eccezioni nessuno si mette a cercare errori per te ;)

A parte persone che non hanno assolutamente un tubo da fare, tipo me stasera... -.-

Codice sorgente - presumibilmente Plain Text

  1. while( priority( pila->value, infix[ k ] ) >= 0 )
  2.       {
  3.      postfix[ i++ ] = del( &pila );
  4.       }



Dopo la chiamata alla funzine del(), pila è un puntatore ad un area di memoria che non contiene una pila, suppongo sia un puntatore non inizializzato... quindi appena cerchi di accedere a un suo attributo (value) hai un segmentatio fault...
O hai sbagliato qualcosa nella funzione del() o ti sei dimenticato di di quel che succede quando la pila finisce...

Però non ti so dire nulla di certo principalmente per due motivi:
- Il programma non l'ho fatto io e non ho la più pallida idea di cosa debba fare XD
- Il debugger di dev-c++ è quanto di più inutile e malfunzionante io abbia mai visto... -.-
Mi ero viziato un po' troppo con quello di Netbeans :love:

Comunque la cosa che devi imparare non è tanto dov'è l'errore, ma come trovarlo. In genere se si ha e si sa usare un debugger è abbastanza rapido individuare gli errori. Altrimenti (se il debugger... ehm... è come quello di dev-c++ :rotfl: ) metti printf dappertutto per vedere dove ci sono errori...

Se opti per la seconda strada ti consiglio di definire delle macro per evitare di scrivere printf(ecc.ecc.) tutte le volte, l'ho letto su Thinking C++ ed è abbastanza utile se ci si deve arrangiare. Esempio:
Codice sorgente - presumibilmente C/C++

  1. #define p(x) printf("\n%s: %i", #x, x);
  2. #define ps(x) printf("\n%s: %s", #x, x);
  3. #define pc(x) printf("\n%s: %c", #x, x);


Così ti basta chiamare p(variabile) per stampare il nome della variabile...

Buon lavoro
:k:

Ultima modifica effettuata da Babel il 07/02/2008 alle 20:47
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:59
Giovedì, 07/02/2008
grazie x le risposte...
ora provo un po ma mi sa che opto x qualcos'altro....
La pila nn può finire cmq..
:ot:
cmq ho chiesto a voi xkè è da tre gg che cerco sto ca*** di errore e nn riesco a trovarlo....
che rabbia!!
be grazie ancora... se lo risolvo ve lo dico
PS ora cerco un debugger x slackware...

Ultima modifica effettuata da il 07/02/2008 alle 21:12
PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 21:21
Giovedì, 07/02/2008
@bond93
Quando entry in questo ciclo

while( priority( pila->value, infix[ k ] ) >= 0 )
{
   postfix[ i++ ] = del( &pila );
}

pila e' un puntatore valido e viene utilizzato nella while.
All'interno del ciclo, con la funzione del, il puntatore pila viene invalidato e
quando il controllo ritorna alla while pila e' un puntatore null e

pila->value

genera il seg fault.

Non ho esaminato *tutto* il codice per capire l'origine "logica" dell'errore.
Quello devi capirlo tu.

@Babel
Solo per la precisione, quello che hai scritto sui seg fault non e' molto corretto.

"Gli errori di segmentazione avvengono quando tratti un certo tipo come se fosse un
altro tipo... come trattare un puntatore a int come un puntatore a una struttura ecc"

Questa non e' una causa diretta del seg fault che e' semplicemente un errore
determinato dal fatto che il programma tenta di accedere ad un indirizzo virtuale
di memoria (tramite un puntatore) quando questo indirizzo NON e' allocato al processo
(e questo avviene *sempre* perche' il valore di un puntatore, per un *qualsiasi*
motivo, non e' corretto).

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:54
Sabato, 09/02/2008
ok alla fine ce l'ho fatta il codice corretto è questo:
Codice sorgente - presumibilmente Plain Text

  1. for( a = 0, temp = string[ a ]; string[ a ] != '\0'; a++, temp = string[ a ] )
  2.    {
  3.       if( isdigit( temp ) )
  4.       {
  5.          output[ k++ ] = temp;
  6.          if( !isdigit( string[ a + 1 ] ) )
  7.             output[ k++ ] = ' ';
  8.          continue;
  9.          continue;
  10.       }
  11.       if( temp == '(' ){
  12.          push( &pila, temp );
  13.          continue;
  14.       }
  15.       if( temp == ')' )
  16.       {
  17.          while( ( temp1 = pop( &pila ) ) != '(' )
  18.             output[ k++ ] = temp1;
  19.          continue;
  20.          continue;
  21.       }
  22.       if( isOperator( temp ) )
  23.       {
  24.          while( priority( pila->value, temp ) >= 0 ){
  25.             output[ k++ ] = pila->value;
  26.             output[ k++ ] = ' ';
  27.             pop( &pila );
  28.          }
  29.          push( &pila, temp );
  30.       }
  31.    }


PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 8:30
Lunedì, 11/02/2008
Ci sono due

continue;
continue;

... uno e' di troppo ...

... Prego, di nulla ...

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:57
Lunedì, 11/02/2008
ok grz...
cmq nn ho capito dove sbagliavo...:rotfl:

PM Quote