Oppure

Loading
13/11/14 20:48
Arat
Ciao a tutti, sto imparando da solo il C, e sto facendo una specie di programma gestionale proposto in un libro. Devo realizzare una struttura dinamica su cui si possono eseguire varie funzioni. Il problema è che già arrivati alla funzione stampa sto incontrando dei problemi abbastanza importanti dato che mi crasha per qualche motivo che non riesco proprio a comprendere. Qualcuno potrebbe aiutarmi? Grazie mille

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

typedef struct
{
 int day;
 int month;
 int year;
} DATE_T;

typedef struct {
    DATE_T date;
    int codice;
    int codiceProdotto;
    int n;
} GESTIONE_T;

GESTIONE_T *gestione;
int index = 0;

void add(GESTIONE_T *gestione);
void stampa(GESTIONE_T *gestione);

int main()
{
    printf("1 - Inserimento ");
    add(gestione);

    printf("2 - Stampa");
    stampa(gestione);

    return 0;
}

void add(GESTIONE_T *gestione)
{
    gestione = (GESTIONE_T*) malloc((index + 1) * sizeof(GESTIONE_T));
    if (gestione == NULL) {
        printf("Errore durante l'allocazione della memoria");
        exit(EXIT_FAILURE);
    }

    printf("\nInserisci il tuo codice identificativo: ");
    scanf("%d", &gestione[index].codice);
    printf("test 1 : %d", gestione[index].codice);

    printf("\nInserisci il codice del prodotto: ");
    scanf("%d", &gestione[index].codiceProdotto);
    printf("test 2 : %d", gestione[index].codiceProdotto);

   /* printf("\nInserisci il numero di oggetti venduti: ");
    scanf("%d", &gestione[index].n);
    printf("test 3 : %d",gestione[index].n);*/

    index++;

    printf("\nInserisci la data nel formato GG/MM/YY: ");
    scanf("%d/%d/%d", &gestione[index].date.day, &gestione[index].date.month, &gestione[index].date.year);
    return;
}

void stampa(GESTIONE_T *gestione)
{

    printf("Code: %d - Codice prodotto: %d - Numero: ", (gestione + index)->codice, (gestione + index)->codiceProdotto);

    return;
}
aaa
13/11/14 21:25
pierotofy
Un problema (forse c'e' ne sono altri) e' qui:

gestione = (GESTIONE_T*) malloc((index + 1) * sizeof(GESTIONE_T));


Ad ogni chiamata tu allochi un nuovo blocco di memoria (che peraltro diventa piu' e piu' grande ad ogni chiamata, vista l'espressione index + 1). Quando questo succede però, il riferimento alla memoria precedente viene perso.

In pratica alla prima chiamata: (? = memoria allocata ma non inizializzata, probabilmente 0 se il compilatore è furbo)

gestione: [record1, ?]

Alla seconda chiamata:

gestione: [record2, ?, ?]

Alla terza:

gestione: [record3, ?, ?, ?]

Eccetera...

Mentre il risultato che vuoi tu (alla terza chiamata) dovrebbe avere:

gestione: [record1, record2, record3]
Il mio blog: piero.dev