Newsgroup: it.comp.lang.c
Titolo: HELP!!!!

Salve a tutti,
vi risparmio dalle bestemmie che ho lanciato fino ad ora e vi pongo subito
il mio problema.
Sto facendo una *semplicissima* calcolatrice RPN, che prende una stringa e
controlla ogni carattere. Se e' un numero, lo mette nello stack, se e' un
operando (gli operandi disponibili sono +, * e /, questa calcolatrice non
contempla la sottrazione) preleva i numeri dallo stack, fa l'operazione e
rimette il risultato nello stack...semplice.
Si vede che sono incapace io...
:)
Di seguito potete vedere il mio listato commentato. Penso che l'errore stia
nel secondo ciclo for, tanto per intenderci quello che controlla i
caratteri, anche perche' il compilatore mi da un warning che in pratica dice
che la condizione e' sempre vera...ed in effetti l'output del programma
esegue il primo ciclo per bene,...e poi continua non si sa bene
perche'....(es. Inserendo 2 3 +, arriva a stamparmi il risultato in cima
allo stack, che e' 5, ma poi continua il ciclo fino, penso, a che non
finisca il vettore di 1000 elementi).
Ecco il codice:
#include <stdio.h>
#define MAX 1000
float stk[MAX];   /*stack*/
int sp=0;         /*puntatore allo stack*/
void push (float x);  /*prototipi....*/
float pop (void);
void print_top(void);
void plus (void);
void mul (void);
void fdiv (void);
int main (void)
{
 int i;
 float num;
 char string[MAX];                    /*stringa in input*/
 for (i=0;string[i]<MAX;i++);
    string[i]=0;                     /*perche' non azzerare il vettore?*/
 printf ("Inserisci una stringa:");
 gets(string);                           /*prende la stringa...*/
 printf ("%s",string);                   /*...e la stampa*/
 for(i=0; string[i]!='/0';i++)           /*controlla ogni
carattere....(penso ke l'errore sia qui)*/
   if (string[i]>='0' && string[i]<='9') /*..per vedere se e' un numero...*/
     {
       num=atof(&(string[i]));           /*(e in tal caso lo converte...*/
       push (num);                       /*...e lo mette nello stack)*/
     }
   else                                 /*oppure un carattere...(+,*,/)*/
   {
    switch(string[i])                   /*e in tal caso esegue le
rispettive*/
         {                              /*funzioni*/
           case '+':plus();
                    print_top();
                    break;
           case '*':mul();
                    print_top();
                    break;
           case '/':fdiv();
                    print_top();
                    break;
           case ' ':break;
          }
   }
 }
}
void push (float x)     /*mette dati nello stack*/
{
 printf ("PUSH\n");
 if (sp<MAX)
   {
   stk[sp++]=x;
   printf ("push eseguito");
   }
 else printf ("\nStack pieno!\n");
}
float pop (void)      /*preleva dati dallo stack*/
{
 float y;
 printf ("POP\n");
 if (sp>0)
    printf ("pop eseguito");
    y=stk[--sp];
    return y;
  }
  else printf ("\nStack vuoto!\n");
}
void plus (void)       /*preleva operandi dallo stack e fa la somma...*/
{
 float a;
 printf ("PLUS\n");
 push(pop()+pop());         /*...poi mette il risultato nello stack.*/
}
void mul (void)        /*...come sopra, ma fa la moltiplicazione...*/
{
 printf ("MUL\n");
 push(pop()*pop());
}
void fdiv (void)       /*....divisione...*/
{
 float x,y,z;
 printf ("FDIV\n");
 x=pop();
 y=pop();
 if (y==0)
   printf ("\nErrore! Impossibile dividere per zero!\n");
 else
    {
     z=x/y;
    }
 push (z);
}
void print_top (void)           /*stampa il valore in cima allo stack*/
{
 float i;
 i=pop();
 printf ("Il valore in cima allo stack e':%f", i);
 push(i);
}

    printf ("\nErrore! Impossibile dividere per zero!\n");
...
Non ho controllato a fondo, ma penso che dia come risultato della divisione
per zero, il valore zero...
Ciao
Riz


leggevi Super Shen?