Segmentation fault associato ad un float in struttura

di il
16 risposte

Segmentation fault associato ad un float in struttura

Qui Neotry, subito dopo la presentazione.
Vengo al dunque, sono un paio di giorni che mi trovo per le mani un programma per la gestione di liste in un gruppo che fa utilizzo di un paio di ADT di prima categoria, le funzioni non sembrano difficili da scrivere ne per l'adt delle liste, ne per quello della tabella di simboli. Scrivo tutto, correggo gli error ed i warning dati dal compilatore e succede: segmentation fault. Dunque la questione è difficile da spiegare, le tipologie e le dimensioni sembrano essere corrette (ho ricontrollato tutte le malloc più volte), dopo ore di debug "a mano" mi accorgo che se nei dati registrati nella malloc precedente a quella dove trovo il segmentation fault, rimuovo la parte float l'errore scompare. Ora vorrei capire cosa cavolo sia successo. Se siete disposti ad aiutarmi allegherò successivamente i source e gli headers con relativa riga di errore. Vi ringrazio fatemi sapere.

16 Risposte

  • Re: Segmentation fault associato ad un float in struttura

    Posta il codice. Comunque consiglio di cercare di riprodurre il problema con un codice semplificato, ovvero prova a togliere tutto quello che non ha a che fare con il problema
  • Re: Segmentation fault associato ad un float in struttura

    Non trascrivo il main che tanto funge soltanto da client per i due adt.
    in arrivo:
    Gruppo.h
    #ifndef GRUPPO_H_INCLUDED
    #define GRUPPO_H_INCLUDED
    #include "Catalogo.h"
    
    typedef struct group_wrapper *PTG;
    typedef struct group_member *PMG;
    typedef struct list_member *PME;
    
    PTG group_wrapper_init();
    PMG group_member_init();
    PME list_member_init();
    PTG read_group(char* fng, PTC swcg);
    PMG search_list(char* sln, PTG swglf);
    void mod_list(PTG swgm, PTC swcm);
    void add_list(PTG swga, PTC swca);
    void show_lists(PTG swgs, PTC swcs);
    void show_list_total(PTG swgst, PTC swcst);
    float list_total(PMG sgmlt, PTC swclt);
    
    
    
    
    #endif // GRUPPO_H_INCLUDED
    
    Gruppo.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "Gruppo.h"
    #include "Catalogo.h"
    #define MAX 30
    
    struct list_member
    {
        int index;
        int qnt;
        PME next_list_member;
    };
    
    struct group_member
    {
        char name_list[MAX];
        PME head_list;
        PME tail_list;
        int size_list;
        PMG next_group_member;
    };
    
    struct group_wrapper
    {
        PMG head_group;
        PMG tail_group;
        int size_group;
    };
    
    PTG group_wrapper_init()
    {
        PTG wrapp;
        wrapp=(PTG)malloc(sizeof*wrapp);<-----------SEGMENTATIO FAULT HERE!!!
        return wrapp;
    }
    
    PMG group_member_init()
    {
        PMG gmmb;
        gmmb=(PMG)malloc(sizeof*gmmb);
        return gmmb;
    }
    
    PME list_member_init()
    {
        PME lmmb;
        lmmb=(PME)malloc(sizeof*lmmb);
        return lmmb;
    }
    
    PTG read_group(char* fng, PTC swcg)
    {
        FILE* fp;
        PTG swgr;
        PMG sgm;
        PME slm;
        char temp[MAX];
        int i, j;
    
        swgr=group_wrapper_init();
    
        swgr->head_group=group_member_init();
        sgm=swgr->head_group;
    
        fp=fopen(fng,"r");
        fscanf(fp,"%d", &swgr->size_group);
    
        for(i=0; i<swgr->size_group; i++)
        {
            sgm->head_list=list_member_init();
            slm=sgm->head_list;
    
            fscanf(fp,"%d", &sgm->size_list);
            fscanf(fp,"%s", sgm->name_list);
    
            for(j=0; j<sgm->size_list; j++)
            {
                fscanf(fp,"%s %d", temp, &slm->qnt);
                slm->index=get_index(temp, swcg);
    
                slm->next_list_member=NULL;
    
                if(j==(sgm->size_list-1)) continue;
                slm->next_list_member=list_member_init();
                slm=slm->next_list_member;
            }
    
            sgm->tail_list=slm;
            sgm->next_group_member=NULL;
    
            if(i==(swgr->size_group-1)) continue;
            sgm->next_group_member=group_member_init();
            sgm=sgm->next_group_member;
        }
    
        swgr->tail_group=sgm;
    
        return swgr;
    }
    
    PMG search_list(char* sln, PTG swglf)
    {
        int i;
        PMG sgmlf=swglf->head_group;
    
        for(i=0; i<swglf->size_group; i++)
        {
            if (strcmp(sln, sgmlf->name_list)==0)
                return sgmlf;
            sgmlf=sgmlf->next_group_member;
        }
    
        return NULL;
    }
    
    void mod_list(PTG swgm, PTC swcm)
    {
        char temp[MAX];
        PMG sgms;
        PME slms;
    
        printf("Digita il nome della lista da modificare: ");
        gets(temp);
        sgms=search_list(temp, swgm);
    
        while(sgms==NULL)
        {
            printf("Lista non trovata, ridigita: ");
            gets(temp);
            sgms=search_list(temp, swgm);
        }
    
        slms=sgms->tail_list;
        slms->next_list_member=list_member_init();
        slms=slms->next_list_member;
    
        printf("Digita il nome seguito dalla quantita' dei prodotti che vuoi aggiungere, quindi digita FINE per terminare");
        while(scanf("%s %d", temp, &slms->qnt)==2)
        {
            slms->index=get_index(temp, swcm);
            if(slms->index==-1)
            {
                printf("Prodotto non presente nel catalogo, ridigita:");
                continue;
            }
            sgms->tail_list=slms;
            slms->next_list_member=list_member_init();
            slms=slms->next_list_member;
            sgms->size_list++;
        }
        sgms->tail_list->next_list_member=NULL;
    }
    
    void add_list(PTG swga, PTC swca)
    {
        char temp[MAX];
        PMG smga;
        PME smla;
    
        swga->tail_group->next_group_member=group_member_init();
        smga=swga->tail_group->next_group_member;
        swga->tail_group=smga;
        smga->next_group_member=NULL;
    
        printf("Digita il nome della nuova lista");
        gets(smga->name_list);
    
        smga->head_list=list_member_init();
    
        printf("Digita il nome seguito dalla quantita' dei prodotti che vuoi aggiungere, quindi digita FINE per terminare");
        while(scanf("%s %d", temp, &smla->qnt)==2)
        {
            smla->index=get_index(temp, swca);
            if(smla->index==-1)
            {
                printf("Prodotto non presente nel catalogo, ridigita:");
                continue;
            }
            smga->tail_list=smla;
            smla->next_list_member=list_member_init();
            smla=smla->next_list_member;
            smga->size_list++;
        }
        smga->tail_list->next_list_member=NULL;
        swga->size_group++;
    }
    
    void show_lists(PTG swgs, PTC swcs)
    {
        int i=0;
        float tot=0;
        PMG smgh;
    
        smgh=swgs->head_group;
    
        for(i=0; i<swgs->size_group; i++)
        {
            printf("\n\nNome lista: %s", smgh->name_list);
    
            tot+=list_total(smgh, swcs);
    
            smgh=smgh->next_group_member;
        }
    
        printf("Totale costo gruppo d'acquisto: %f", tot);
    }
    
    void show_list_total(PTG swgst, PTC swcst)
    {
        char temp[MAX];
        printf("Digita il nome della lista di cui vuoi visualizzare il prezzo: ");
        gets(temp);
        printf("Il totale della lista e': %lf", list_total(search_list(temp,swgst), swcst));
    }
    
    float list_total(PMG sgmlt, PTC swclt)
    {
        int j=0;
        float subtot=0;
        PME smlh;
    
        smlh=sgmlt->head_list;
    
            for(j=0; j<sgmlt->size_list; j++)
            {
                printf("\n%s %d", retrieve_name(smlh->index, swclt), smlh->qnt);
                subtot+=retrieve_price(smlh->index, smlh->qnt, swclt);
                smlh=smlh->next_list_member;
            }
        return subtot;
    }
    
    Catalogo.h
    #ifndef CATALOGO_H_INCLUDED
    #define CATALOGO_H_INCLUDED
    
    typedef struct wrapper_catalog *PTC;
    typedef struct catalog_member *PML;
    typedef PML *PVL;
    
    PTC wrapper_catalog_init();
    PVL catalog_vect_init(int n);
    PTC read_catalog(char* fnc);
    int get_index(char* item_name, PTC swci);
    char* retrieve_name(int sin, PTC swcn);
    float retrieve_price(int sip, int sqnt, PTC swcp);
    
    
    
    #endif // CATALOGO_H_INCLUDED
    
    Catalogo.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "Catalogo.h"
    #define MAX 30
    
    struct catalog_member
    {
        char name[MAX];
        float price;
    };
    
    struct wrapper_catalog
    {
        PVL catalog_vect; //DOPPIO PUNTATORE
        int size_catalog;
    };
    
    PTC wrapper_catalog_init()
    {
        PTC cwrapp;
        cwrapp=(PTC)malloc(sizeof*cwrapp);
        return cwrapp;
    }
    
    PVL catalog_vect_init(int n)
    {
        int i=0;
        PVL cmmb;
        cmmb=(PVL)malloc(n*sizeof**cmmb);
        for(i=0; i<n; i++)
        {
            cmmb[i]=(PML)malloc(sizeof*cmmb);
        }
        return cmmb;
    }
    
    PTC read_catalog(char* fnc)
    {
        float temporal;
        FILE* fp;
        PTC swcr;
        PVL svp;
        int i;
    
        swcr=wrapper_catalog_init();
    
        fp=fopen(fnc,"r");
        fscanf(fp,"%d", &swcr->size_catalog);
    
        swcr->catalog_vect=catalog_vect_init(swcr->size_catalog);
        svp=swcr->catalog_vect;
    
        for(i=0; i<swcr->size_catalog; i++)
        {
            fscanf(fp,"%s %f", svp[i]->name, &temporal);
            svp[i]->price=temporal;
        }
    
        fclose(fp);
    
        return swcr;
    }
    
    int get_index(char* item_name, PTC swci)
    {
        int i=0;
        for(i=0; i<swci->size_catalog; i++)
        {
            if(strcmp(item_name,swci->catalog_vect[i]->name)==0)
                return i;
        }
        return -1;
    }
    
    char *retrieve_name(int sin, PTC swcn)
    {
        return swcn->catalog_vect[sin]->name;
    }
    
    float retrieve_price(int sip, int sqnt, PTC swcp)
    {
        float pht;
        pht=sqnt*(swcp->catalog_vect[sip]->price);
        return pht;
    }
  • Re: Segmentation fault associato ad un float in struttura

    Suggerivo di semplificare il codice facendo in modo che di riprodurre il problema con un codice ridotto all'osso
  • Re: Segmentation fault associato ad un float in struttura

    Comunque dovresti scrivere sizeof(struttura) e non sizeof*puntatore a struttura... Strano che il compilatore non ti abbia dato warning...
  • Re: Segmentation fault associato ad un float in struttura

    Guarda da dispense è scritto così, comunque il cast non dice nulla, e pur cambiando la dicitura del sizeof sengala quella maledettissima segmentation fault, non capisco cosa intendi con ridurre il codice, da consegna quello è il grado di pulizia massimo che riesco a dargli, ho persino separato le funzioni di inizializazzione... dove pensi possa essere il problema? ho notato che se nella funzione di lettura per Catalogo.c non leggo il float della struttura catalog_member l'errore non si presenta. Non so davvero dove sbattere la testa.
  • Re: Segmentation fault associato ad un float in struttura

    Se vuoi allocare una struttura devi scrivere
    ptr = malloc(sizeof(struct miastruttura))
    sizeof é u a funzione che ti ritorna la dimensione in byte di un tipo di dato.
    Questo é il tuo problema.
    AGGIUNGO:attenzione a non richiedere il sizeof del puntatore,richiedi il sizeof della struttuta... Controlla bene le dispense
  • Re: Segmentation fault associato ad un float in struttura

    @candaluar, e' peggio d icosi': sizeof non e' una funzione, e' una keyword del linguaggio.

    Strano che compili!
  • Re: Segmentation fault associato ad un float in struttura

    Compila e senza errori! Comunque ora ho provato la dicitura pointer=malloc(sizeof(struct struttura)); non ha dato errore! però a questo punto non capisco le dispense cosa cavolo dicano se volete vi mando uno screen, sono sicurissimo che allochino in quel modo!
  • Re: Segmentation fault associato ad un float in struttura

    Neotry ha scritto:


    Compila e senza errori! Comunque ora ho provato la dicitura pointer=malloc(sizeof(struct struttura)); non ha dato errore! però a questo punto non capisco le dispense cosa cavolo dicano se volete vi mando uno screen, sono sicurissimo che allochino in quel modo!
    Le "dispense" non sono state consegnate a Mosè scolpite sulla pietra davanti ad un simbolico cespuglio infuocato in cima al monte Sinai. Pertanto, anche ammesso che tu ricordi correttamente il contenuto di tale "dispensa", si deve sempre tenere presente che esse possono contenere errori e strafalcioni d'ogni sorta, come peraltro capita (ahinoi sempre più spesso) perfino sulla carta stampata, quella dei migliori libri e dei migliori autori.

    Il proprio senso critico va sempre coltivato e lasciato su ON. E non si deve mai, in alcun caso, affidarsi ad una unica fonte - a maggior ragione quando trattasi di semplici "dispense" e non di testi passati per le mani di numerosi revisori e centinaia di migliaia di lettori ben preparati per decine di anni.
  • Re: Segmentation fault associato ad un float in struttura

    Postale queste dispense... Vediamole...
  • Re: Segmentation fault associato ad un float in struttura

    M.A.W. 1968 ha scritto:


    Le "dispense" non sono state consegnate a Mosè scolpite sulla pietra davanti ad un simbolico cespuglio infuocato in cima al monte Sinai. Pertanto, anche ammesso che tu ricordi correttamente il contenuto di tale "dispensa", si deve sempre tenere presente che esse possono contenere errori e strafalcioni d'ogni sorta, come peraltro capita (ahinoi sempre più spesso) perfino sulla carta stampata, quella dei migliori libri e dei migliori autori.

    Il proprio senso critico va sempre coltivato e lasciato su ON. E non si deve mai, in alcun caso, affidarsi ad una unica fonte - a maggior ragione quando trattasi di semplici "dispense" e non di testi passati per le mani di numerosi revisori e centinaia di migliaia di lettori ben preparati per decine di anni.
    Eh qua sono stato proprio pollo io a questo punto e son felicissimo di aver trovato voi che avete saputo aiutarmi, però a mia discolpa evidenzio il mio status di novizio, che quanto meno ci prova a fidarsi dei professori, chiedo scusa se son sembrato arrogante o simili perchèè non era davvero mia intenzione nel modo più assoluto.
    Comunque allego le immagini delle 3 pagine incriminate, l'esempio è sull'allocazione dinamica di una struttura grafo (seguendo quel modello di allocazione mi sono incagliato).

    Qui dichiara il puntatore alla struttura

    Qui definisce la struttura

    Qui alloca nel malsano modo!
  • Re: Segmentation fault associato ad un float in struttura

    Sarebbe interessante conoscere il compilatore che utilizzate e qual è il sistema operativo.
  • Re: Segmentation fault associato ad un float in struttura

    candaluar ha scritto:


    Sarebbe interessante conoscere il compilatore che utilizzate e qual è il sistema operativo.
    Il compilatore se non erro è Gnu CC, sistema operativo windows.

    Ot: ci sono compilatori migliori? Se si quali? Gnu CC è quello standard di codeblocks.
  • Re: Segmentation fault associato ad un float in struttura

    Ho scaricato l'ultima versione disponibile di code::blocks (16.01) con compilatore mingw (4.9.2) e ho predisposto questo semplice programma di test:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 30
    
    typedef struct group_wrapper *PTG;
    typedef struct group_member *PMG;
    typedef struct list_member *PME;
    
    struct list_member
    {
        int index;
        int qnt;
        PME next_list_member;
    };
    
    struct group_member
    {
        char name_list[MAX];
        PME head_list;
        PME tail_list;
        int size_list;
        PMG next_group_member;
    };
    
    struct group_wrapper
    {
        PMG head_group;
        PMG tail_group;
        int size_group;
    };
    
    
    int main()
    {
        PMG ptr;
        printf( "sizeof(*ptr)    = %d\n", sizeof(*ptr) );
        printf( "sizeof *ptr     = %d\n", sizeof *ptr );
        printf( "sizeof*ptr      = %d\n", sizeof*ptr );
        printf( "sizeof(struct)  = %d\n", sizeof(struct group_member) );
    
        return 0;
    }
    
    In questo programma provo tutte le combinazioni di lettura della dimensione della struttura puntata da un puntatore PMG: ho lanciato in esecuzione in un ambiente Windows XP a 32 bit e in tutti i casi mi viene restituito 48 (se mi avesse restituito 42 avrei riso ).
    Sarebbe interessante conoscere questi valori nel tuo ambiente ed eventualmente conoscere anche i risultati nel punto in cui fai la malloc, tra il caso che va (quello con la struct) e quello che non va (usando sizeof senza parentesi).
Devi accedere o registrarti per scrivere nel forum
16 risposte