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.
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 ===|
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.
Ho anche definito il tipo:
codice:
typedef int (*FunctionPointer) (float,float);
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;
}
Sto compilando con GCC e code::blocks.