La pop, collaudata, dovrebbe essere giusta, in quanto dovrebbe essere chiamata solo in caso sia già stato invocato push(). Quando invochi push, prima copi il valore nella posizione corrente e poi incrementi la posizione; per questo la posizione dell'ultimo valore è quella precedente a quella puntata attualmente.Originariamente inviato da ramy89
Nella pop:
Se p punta all' ultimo elemento inserito, con un pre-decremento restituisci il penultimo inserito, non l' ultimo.
Meglio fare un post-decremento:
Che poi ci dovrebbe essere qualcosa per controllare gli errori e le eccezioni, beh su quello hai ragione, ma ci lavorerò in seguito, appena mi riesce di finire il programma per sommi capi
Dovrebbe essere in questa parte di codiceSai la riga esatta dove avviene il segmentation fault?
E altra cosa: gli argomenti possono anche essere tantissimi? Cioè si può digitare 2+4*6+7 ? Perchè in questo caso devi dare la precedenza agli operatori.
Riguardando meglio, penso che la funzione isdigit si aspetta un carattere e non una stringa.codice:if ( isdigit(*argv)) push(atof(*argv));
Per quanto riguarda gli argomenti, si, possono essere massimo 100, come nella definizione di MAX_OP; non so come gestire argomenti infiniti poi per usarli nelle funzioni push e pop.
Ad ogni modo, la calcolatrice polacca è leggermente diversa da quella tradizionale.
Se scrivi qualcosa del tipo 2 3 4 + * dovrebbe darti (4 + 3) * 2.
In pratica mette i valori in un pila e li estrai in ordine inverso; estrae il primo, prende l'operatore e fa (primo estratto (operatore) 2)) e lo memorizza di nuovo nella pila, per poi continuare. Un po' grossolana come spiegazione, ma spero si capisca![]()