Programma C

Sk_Anonymous
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è?

#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
Sk_Anonymous
è una stringa pertanto non ci vuole l'&!

vict85
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.

Sk_Anonymous
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++

_Tipper
Per il codice corretto basta fare un quote del messaggio di Ene@.

Sk_Anonymous
"Tipper":
Per il codice corretto basta fare un quote del messaggio di Ene@.



Infatti;
Il codice è sintatticamente corretto.

Sk_Anonymous
"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 :cry:

Sk_Anonymous
"Sergio":
[quote="Ene@"]Grazie ma non è cambiato nulla :cry:

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


vict85
Con Visual Studio non si blocca...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.