Salve,sto provando a programmare una calcolatrice,utilizzo un buffer preso da input,questo buffer può memorizzare infiniti caratteri,visto che la funzione input prevede l' allocazione dinamica.
Poi uso un array di puntatori a funzione,ogni volta che incontro un operando la dimensione dell' array si allarga e contiene l' indirizzo della rispettiva funzione.
La sto facendo in maniera semplice,per ora senza prevedere errori di digitazione.
Alla fine dovrei avere un array di funzioni (op è il numero totale di funzioni),e un array di float.
Alla fine dovrei andare a eseguire le operazioni prendendo tutto l' array di float (dinamico),e facendo le operazioni tra un float di indice pari e un float di indice dispari,tenendo presente di non eseguire operazioni per l' ultimo float.
Ma il problema principale è che op rimane sempre uguale a zero,nello switch case specifico che se il buffer contiene un carattere come ' : ' op deve aumentare e deve essere allocato lo spazio per un altro indirizzo di funzione,ma niente da fare,rimane sempre fermo a 0.
Questo è il codice della main,le funzioni sono semplici funzioni per somma,potenza,ecc... e input è la funzione che prende in input da stdin e alloca.codice:E' tutto qua il problema,il comportamento è "inatteso",oltre a segnalarmi una marea di warning: /home/ramy/Documents/NewC/calcolatrice.c||In function ‘main’:| /home/ramy/Documents/NewC/calcolatrice.c|91|warning: assignment from incompatible pointer type| /home/ramy/Documents/NewC/calcolatrice.c|94|warning: assignment from incompatible pointer type| /home/ramy/Documents/NewC/calcolatrice.c|97|warning: assignment from incompatible pointer type| /home/ramy/Documents/NewC/calcolatrice.c|100|warning: assignment from incompatible pointer type| /home/ramy/Documents/NewC/calcolatrice.c|103|warning: assignment from incompatible pointer type| /home/ramy/Documents/NewC/calcolatrice.c|106|warning: assignment from incompatible pointer type| /home/ramy/Documents/NewC/calcolatrice.c|114|warning: format ‘%1.1f’ expects type ‘double’, but argument 2 has type ‘int’| ||=== Build finished: 0 errors, 7 warnings ===|
Ho anche definito il tipo:
codice:typedef int (*FunctionPointer) (float,float);Sto compilando con GCC e code::blocks.codice:int main (int argc,char **argv) { char *buffer; float *numbers,result; int seeker=0,counter=1,size=1,op=0; FunctionPointer *ptr; printf("Calcolatrice:\n-->"); if(numbers==NULL) MERROR numbers=(float*)malloc(sizeof(float)); ptr=(FunctionPointer*)malloc(sizeof(FunctionPointer)); buffer=input(); while(getchar()!=10) ; for(;buffer[seeker];seeker++) { if(buffer[seeker]>=48 && buffer[seeker]<=57) { numbers[size-1]+=(buffer[seeker]-48)*power(10,counter); counter++; } else { size++; op++; if(op!=1) ptr=(FunctionPointer*)realloc(ptr,op*sizeof(FunctionPointer)); numbers=(float*)realloc(numbers,size*sizeof(float)); switch(buffer[seeker]) { case '+': ptr[op-1]=sum; break; case '-': ptr[op-1]=sub; break; case 'x': ptr[op-1]=mult; break; case ':': ptr[op-1]=_div_; break; case '^': ptr[op-1]=power; break; case 'l': ptr[op-1]=logarithm; break; } } } printf("%d",op); int i; for(i=0;i<op;i++) printf("%1.1f",ptr[op-1](2.0,3.0)); return 0; }

Rispondi quotando