Programma C
Tale programma dovrebbe gestire una struttura che ho chiamato vendita e tiene raccia delle vendite di certi prodotti.
Esso viene compilato correttamente ma,all'esecuzione,si blocca non appena inserisco la data.C'è qualcuno che sa dirmi perchè?
Esso viene compilato correttamente ma,all'esecuzione,si blocca non appena inserisco la data.C'è qualcuno che sa dirmi perchè?
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ int codice,tipo; float prezzo; char data[11]; }vendita; void inserisci(vendita *T[3],int *N); void visualizza(vendita *T[3],int *N); void elimina(vendita *T[3],int *N); void menu(); main(){ vendita *TA[3]; int NA[3],opz,i; for(i=0;i<3;i++) { TA[i]=NULL; NA[i]=0; } do { menu(); scanf("%d",&opz); switch(opz){ case 1:inserisci(TA,NA); break; case 2:visualizza(TA,NA); break; case 3:elimina(TA,NA); break; case 0:printf("Fine\n\n\n"); break; default:; } }while(opz!=0); for(i=0;i<3;i++) free(TA[i]); } void inserisci(vendita *T[3],int *N) { vendita v,*R; int i,p,tp; printf("Codice: "); scanf("%d",&v.codice); printf("Tipo: "); scanf("%d",&v.tipo); printf("Prezzo: "); scanf("%f",&v.prezzo); printf("Data: "); scanf("%s",v.data); tp=v.tipo; R=realloc(T[tp],(N[tp]+1)*sizeof(vendita)); if(R==NULL) { printf("Non allocato\n"); return; } for(p=0;p<N[tp];p++) if(v.codice<T[tp][p].codice) break; for(i=N[tp];i>p;i--) T[tp][i]=T[tp][i-1]; T[tp][p]=v; N[tp]++; } void elimina(vendita *T[3],int *N) { int tp,codice,inf,sup,med,i; printf("Tipo: "); scanf("%d",&tp); if(N[tp]==0) { printf("Nessun elemento\n"); return; } printf("Codice: "); scanf("%d",&codice); inf=0; sup=N[tp]-1; while(inf<=sup){ med=(inf+sup)/2; if(T[tp][med].codice==codice) break; else if(codice>T[tp][med].codice) inf=med+1; else sup=med-1; } if(inf<=sup){ for(i=med;i<N[tp]-1;i++) T[tp][i]=T[tp][i+1]; N[tp]--; T[tp]=realloc(T[tp],N[tp]*sizeof(vendita)); } } void visualizza(vendita *T[3],int *N) { int i,j; char data[11]; printf("Data: "); scanf("%s",data); for(i=0;i<3;i++) for(j=0;j<N[i];j++) if(strcmp(T[i][j].data,data)<0) { printf("Data: %s\n",T[i][j].data); printf("Codice: %d\n",T[i][j].codice); } } void menu() { printf("\n\nScegli tra:\n\n\n"); printf("1)Inserimento\n2)Visualizzazione\n3)Cancellazione\n0)Fine\n\n\n"); }
Risposte
è una stringa pertanto non ci vuole l'&!
Rimetti il codice... ci sono delle parti mancanti.
1) gli include non hanno la libreria (che credo siano stdio.h, stdlib.h e string.h)
2) c'é un for incompleto in elimina
3) in inserisci c'é un if senza parentesi
Riguardo alla & ti do ragione...
Un appunto... dovresti aggiungere un po' di controlli. Per esempio chiedi all'utente di inserire un int e poi usi quell'int come indice di un array piccolissimo senza controllare che il numero sia effettivamente nel range voluto.
1) gli include non hanno la libreria (che credo siano stdio.h, stdlib.h e string.h)
2) c'é un for incompleto in elimina
3) in inserisci c'é un if senza parentesi
Riguardo alla & ti do ragione...
Un appunto... dovresti aggiungere un po' di controlli. Per esempio chiedi all'utente di inserire un int e poi usi quell'int come indice di un array piccolissimo senza controllare che il numero sia effettivamente nel range voluto.
Se metto il programma tra [code][/code] non mi visualizza le librerie e scrive il ciclo for dell'elimina in quel modo,ma avevo scritto bene.
Edit: anche senza [code] continu a anon visualizzare le librerie;inoltre il ciclo for dell'elimina è
$i=med;$
i minore di N[tp] -1;
i++
Edit: anche senza [code] continu a anon visualizzare le librerie;inoltre il ciclo for dell'elimina è
$i=med;$
i minore di N[tp] -1;
i++
Per il codice corretto basta fare un quote del messaggio di Ene@.
"Tipper":
Per il codice corretto basta fare un quote del messaggio di Ene@.
Infatti;
Il codice è sintatticamente corretto.
"Sergio":
Grazie Tipper! Ora lo vedo chiaro.
Per Ene@: cambia
R=realloc(T[tp],(N[tp]+1)*sizeof(vendita));
if(R==NULL)
in:
T[tp]=realloc(T[tp],(N[tp]+1)*sizeof(vendita));
if(T[tp]==NULL)
altrimenti T[tp] rimane NULL in eterno
Grazie ma non è cambiato nulla

"Sergio":
[quote="Ene@"]Grazie ma non è cambiato nulla
Cioè?
Prima l'istruzione
T[tp]
= v;
provocava un segmentation fault perché T[tp] restava NULL, ora l'esecuzione prosegue.
Non mi sembra un cambiamento "irrilevante"....[/quote]
Non cambia nulla perchè l'ho provato e dà lo stesso problema
Con Visual Studio non si blocca...