Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] allocazione dinamica di un vettore di strutture in una funzione

    Salve di nuovo ragazzi, questa volta ho un bel grattacapo con l'allocazione dinamica all'interno di una funzione.

    Ho bisogno di allocare dinamicamente ed inizializzare (leggendo da file) un vettore di strutture di dati anagrafici; ogni struttura contiene i campi nome, cognome, giorno di nascita, mese e anno. Qui di seguito posto i codici di due funzioni in teoria equivalenti ma delle quali solo la seconda funziona.

    codice:
    #define SLEN 31
    
    typedef struct persona
    {
        char name[SLEN];
        char surname[SLEN];
        int day, month, year;
    } PERSONA;
    
    void read_file_1 (char* filename, PERSONA** list, int* dim)
    {
        FILE *input = NULL;
        int i;
    
        if ((input=fopen(filename,"r"))==NULL)
        {
            printf("errore apertura file\n");
            return;
        }
    
        fscanf(input,"%d",dim);
    
        *list = (PERSONA*)malloc(*dim*sizeof(PERSONA));
    
        if (*list == NULL)
        {
            printf("errore allocazione memoria\n");
            return;
        }
    
        for (i=0; i<*dim; i++)
        {
            fscanf(input,"%s",list[i]->name);
            fscanf(input,"%s",list[i]->surname);
            fscanf(input,"%d",&(list[i]->day));
            fscanf(input,"%d",&(list[i]->month));
            fscanf(input,"%d",&(list[i]->year));
        }
    
        fclose(input);
    
        return;
    }
    
    PERSONA* read_file_2 (char* filename, int* dim)
    {
        PERSONA* list = NULL;
        FILE *input = NULL;
        int i;
    
        if ((input=fopen(filename,"r"))==NULL)
        {
            printf("errore apertura file\n");
            return NULL;
        }
    
        fscanf(input,"%d",dim);
    
        list = (PERSONA*)malloc(*dim*sizeof(PERSONA));
    
        if (list == NULL)
            return NULL;
    
        for (i=0; i<*dim; i++)
        {
            fscanf(input,"%s",list[i].name);
            fscanf(input,"%s",list[i].surname);
            fscanf(input,"%d",&(list[i].day));
            fscanf(input,"%d",&(list[i].month));
            fscanf(input,"%d",&(list[i].year));
        }
    
        fclose(input);
    
        return list;
    }
    Come già detto, la seconda funzione, che ritorna un puntatore che a sua volta assegno a un altro puntatore nel main, funziona perfettamente. Per quanto riguarda la prima, invece, ottengo un segmentation fault alla seconda iterazione del ciclo marcato in rosso. Eseguendo il debug mi pare di capire che sia stata allocata solo una struttura, e non capisco il motivo. In più, anche mettendo quel codice nel main tutto sembra funzionare a meraviglia. Qualche idea?

  2. #2

  3. #3

    Re: [C] allocazione dinamica di un vettore di strutture in una funzione

    il parametro "list" di read_file_1, da dove a arriva? come lo allochi? come glielo passi in chiamata?

    EDIT: prova così:

    codice:
    PERSONA* read_file_2 (char* filename, int* dim);
    void read_file_1 (char* filename, PERSONA** list, int* dim){
    	*list = read_file_2 (filename, dim);
    }
    ;-)

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In ogni caso, l'errore di accesso alla memoria è causato dal fatto che dovrebbe essere

    codice:
            fscanf(input, "%s", (*list)[i].name);
            fscanf(input, "%s", (*list)[i].surname);
            fscanf(input, "%d", &((*list)[i].day));
            fscanf(input, "%d", &((*list)[i].month));
            fscanf(input, "%d", &((*list)[i].year));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    @MacApp: list è un puntatore a NULL dichiarato nel main e passato per indirizzo
    codice:
    PERSONA* list = NULL;
    read_file_1(fname,&list,&dim)
    @oregon: pensavo che la mia e la tua scrittura fossero equivalenti, visto che si tratta di strutture puntate! cmq ora provo

  6. #6
    infatti non è cambiato nulla :/

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da dayslayer
    infatti non è cambiato nulla :/
    Forse non hai visto bene ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da oregon
    Forse non hai visto bene ...
    non cambia nulla nel senso che ho sostituito la tua versione alla mia e ottengo ugualmente errore

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da dayslayer
    non cambia nulla nel senso che ho sostituito la tua versione alla mia e ottengo ugualmente errore
    Abbi pazienza ... puoi mostrare il codice corretto che ti dà ancora errore ... sia la funzione read_file_1 con le modifiche che ti ho suggerito, sia il main ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Certo, eccolo qui. Posto anche la consegna dell'esercizio e il file da cui effettuare la lettura

    Consegna:
    codice:
    Scrivere un programma che effettui la lettura di un file anagrafico in funzione read_file e che consenta una successiva ricerca tramite cognome e nome in una funzione search. Il file si apre con il numero di persone i cui dati sono memorizzati nel file.
    File:
    codice:
    3
    luca bianchi 19 7 1986
    mario rossi 21 11 1965
    andrea verdi 1 1 1998
    Codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define SLEN 31
    
    typedef struct persona
    {
        char name[SLEN];
        char surname[SLEN];
        int day, month, year;
    } PERSONA;
    
    void read_file_1 (char* filename, PERSONA** list, int* dim);
    PERSONA* read_file_2 (char* filename, int* dim);
    PERSONA* search (PERSONA* list, const int dim);
    
    int main (int argc, char *argv[])
    {
        char fname[SLEN];
        PERSONA* list = NULL;
        PERSONA* occ = NULL;
        int dim;
    
        printf("file: ");
        scanf("%s",fname);
    
        read_file_1(fname,&list,&dim);
        // list = read_file_2(fname,&dim);
    
        if (list==NULL)
        {
            printf("caricamento fallito\n");
            return -1;
        }
    
        occ = search(list,dim);
    
        if (occ == NULL)
            printf("\nnessun elemento trovato\n");
        else
        {
            printf("\nla ricerca ha prodotto il seguente risultato:\n\t");
            printf("%s %s %d %d %d\n",occ->name,occ->surname,occ->day,occ->month,occ->year);
        }
    
        free(list);
    
        return 0;
    }
    
    void read_file_1 (char* filename, PERSONA** list, int* dim)
    {
        FILE *input = NULL;
        int i;
    
        if ((input=fopen(filename,"r"))==NULL)
        {
            printf("errore apertura file\n");
            return;
        }
    
        fscanf(input,"%d",dim);
    
        *list = (PERSONA*)malloc(*dim*sizeof(PERSONA));
    
        if (*list == NULL)
        {
            printf("errore allocazione memoria\n");
            return;
        }
    
        for (i=0; i<*dim; i++)
        {
            fscanf(input, "%s", (*list)[i].name);
            fscanf(input, "%s", (*list)[i].surname);
            fscanf(input, "%d", &((*list)[i].day));
            fscanf(input, "%d", &((*list)[i].month));
            fscanf(input, "%d", &((*list)[i].year));
        }
    
        fclose(input);
    
        return;
    }
    
    PERSONA* read_file_2 (char* filename, int* dim)
    {
        PERSONA* list = NULL;
        FILE *input = NULL;
        int i;
    
        if ((input=fopen(filename,"r"))==NULL)
        {
            printf("errore apertura file\n");
            return NULL;
        }
    
        fscanf(input,"%d",dim);
    
        list = (PERSONA*)malloc(*dim*sizeof(PERSONA));
    
        if (list == NULL)
            return NULL;
    
        for (i=0; i<*dim; i++)
        {
            fscanf(input,"%s",list[i].name);
            fscanf(input,"%s",list[i].surname);
            fscanf(input,"%d",&(list[i].day));
            fscanf(input,"%d",&(list[i].month));
            fscanf(input,"%d",&(list[i].year));
        }
    
        fclose(input);
    
        return list;
    }
    
    PERSONA* search (PERSONA* list, const int dim)
    {
        PERSONA* occ = NULL;
        char searchname[SLEN], searchsurname[SLEN];
        int i;
    
        printf("\nnome: ");
        scanf("%s",searchname);
        printf("cognome: ");
        scanf("%s",searchsurname);
    
        for (i=0; i<dim; i++)
            if ( strcasecmp(searchname,list[i].name)==0 && strcasecmp(searchsurname,list[i].surname)==0 )
                occ = list+i;
    
        return occ;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.