PDA

View Full Version : [C] Problema con programma


danixxx89
22-04-2009, 20:59
Qualcuno mi aiuti per piacere :cry:
L'output di questo programma non mi convince... Il do/while non mi da il risultato che credevo mi dovesse dare: cioè subito dopo "Inserire il carattere di End of File per terminare, altrimenti premere Invio:" mi esce scritto anche
"Inserire operatore aritmetico: " (cosa che non dovrebbe succedere, in quanto deve permettere la chiusura della lista) e non riesco a capire il motivo. :mc:
Come dovrei fare per eliminare questo problema?!?


#include <stdio.h>
#include <stdlib.h>

#define SIZE 10

typedef struct arithmetic_op{
char operation[0];
int num_of_op;
double operands[SIZE];
struct arithmetic_op *next;
}arithmetic_op;

void struct_data_storage(arithmetic_op *nptr);

int main()
{
arithmetic_op *head=NULL;

struct_data_storage(head);

system ("pause");
return 0;
}


void struct_data_storage(arithmetic_op *nptr)
{
int n=0, a;
nptr=(arithmetic_op*)malloc(sizeof(arithmetic_op));

if(nptr!=NULL){

do
{
printf("Inserire operatore aritmetico: ");
scanf("%c", &nptr->operation);

printf("Inserire il numero di operandi: ");
scanf("%d", &nptr->num_of_op);

while(n!=nptr->num_of_op){
printf("Inserire gli operatori: ");
scanf("%f", &nptr->operands);

n++;
}

printf("\n");
n=0;

printf("Inserire il carattere di End of File per terminare,\n"
"altrimenti premere Invio: ");
} while(a=getchar()!=EOF);
}
else {
printf("Memoria non sufficiente\n");
}

nptr->next=NULL;
free(nptr);

return;
}

P.s.: Il programma non è ancora finito, ma è solo un abbozzo.

_Claudio
22-04-2009, 21:16
Dai un'occhiata a fflush().

Torav
22-04-2009, 22:03
probabilmente ti rimane nel buffer un \n che ti "annulla" lo scanf. Non usare fflush perchè è una funzione che serve unicamente sugli stream di output e il comportamento su quelli di input è indefinito. Ti consiglio di usare getc, fgets e non scanf!

_Claudio
22-04-2009, 22:15
probabilmente ti rimane nel buffer un \n che ti "annulla" lo scanf. Non usare fflush perchè è una funzione che serve unicamente sugli stream di output e il comportamento su quelli di input è indefinito. Ti consiglio di usare getc, fgets e non scanf!

È vero... in effetti fflush è controindicata per gli stream di input ma alla carlona la si usa... e mi era uscito di mente il fatto che questo suo uso è deprecato...

Torav
22-04-2009, 22:29
È vero... in effetti fflush è controindicata per gli stream di input ma alla carlona la si usa... e mi era uscito di mente il fatto che questo suo uso è deprecato...

in un certo senso sono d'accordo, un paio di volte l'ho usata anche io per fare fix "al volo" e vedere se era lì il problema :D , però secondo me conviene sempre sottolineare cosa è standard e cosa no ;)

_Claudio
22-04-2009, 23:04
in un certo senso sono d'accordo, un paio di volte l'ho usata anche io per fare fix "al volo" e vedere se era lì il problema :D , però secondo me conviene sempre sottolineare cosa è standard e cosa no ;)

Totalmente d'accordo con te, anche io sono un purista e preferisco usare linguaggi e architetture per come sono state concepite evitando il più possibile un uso approssimativo... che spesso poi genera errori inattesi e peggiora le performance.

danixxx89
23-04-2009, 18:35
probabilmente ti rimane nel buffer un \n che ti "annulla" lo scanf. Non usare fflush perchè è una funzione che serve unicamente sugli stream di output e il comportamento su quelli di input è indefinito. Ti consiglio di usare getc, fgets e non scanf!

Grazie mille :D problema risolto. Ho inserito come hai detto una getc alla fine del ciclo while.


printf("Inserire il carattere di End of File per terminare,\n"
"altrimenti premere Invio: ");
a=getc(stdin);



Adesso l'unico problema è che non mi memorizza nella struttura i dati. Ho messo delle printf subito dopo le scanf per visualizzare cosa veniva realmente salvato, ma i dati non vengono salvati. Come mai?

Torav
23-04-2009, 18:51
a occhio ci sono almeno 2 errori. Scusa per curiosità, che compilatore e che sistema operativo usi? Se usi gcc ti conviene utilizzare il flag -Wall per visualizzare i warning, perchè questi errore ti verrebbero segnalati. Ad ogni modo:


scanf("%c", &nptr->operation);


perchè hai definitio operation come un char[0]? Definiscilo come char senza aggiungere altro!


scanf("%f", &nptr->operands);


qui invece mi sa che ti sei scordato un [n] dopo operands.

danixxx89
23-04-2009, 19:22
a occhio ci sono almeno 2 errori. Scusa per curiosità, che compilatore e che sistema operativo usi? Se usi gcc ti conviene utilizzare il flag -Wall per visualizzare i warning, perchè questi errore ti verrebbero segnalati. Ad ogni modo:


scanf("%c", &nptr->operation);


perchè hai definitio operation come un char[0]? Definiscilo come char senza aggiungere altro!


scanf("%f", &nptr->operands);


qui invece mi sa che ti sei scordato un [n] dopo operands.

che scemo che sono :p ... grazie per avermi fatto notare gli errori.
Comunque come os uso windows e per scrivere i programmi in c uso dev-c++.

p.s.: ho definito operation come un char[0] perchè inizialmente avevo un'altra intenzione. Grazie ancora :D