Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C] Errore di segmentazione

    Salve, questo codice mi da un errore di segmentazione che non riesco a risolvere nonostante vari tentativi. Queste sono le strutture:

    codice:
    struct Prodotto{
         char tipo[20];
         int quantita[N_PROD];
    }Prodotto[N_PROD] = {{"Caffe"},{"Tessuti"},{"Spezie"},{"Legno"},{"Ceramiche"}};
    
    typedef struct {
         int data;
         struct Prodotto venduto;
    }Giornata;
    
    typedef struct {
         char nome[20];
         char cognome[20];
         int codice;
         Giornata* giornata[MAX_GIORNI];
    }Agente;

    Questa è la funzione che da problemi. Viene chiamata da un'altra funzione che le passa i due parametri, a sua volta ricevuti dal main. La prima funzione li usa e non da problemi. Questa va in segmentazione sulla scanf indicata dalla freccia:

    codice:
    void creaGiornate(Agente* ag, int i) {
         int j, num_giorni;
         
         printf("Quante giornate hai lavorato in questo mese?  ");
         scanf("%d", &num_giorni);
         for(j = 0; j < num_giorni; j++) {
              ag[i].giornata[j] = (Giornata*)malloc(sizeof(Giornata));
              if(ag[i].giornata[j] == NULL) {
                   printf("Errore di allocazione!\n");
                   return;
              }
              printf("Inserisci il %d%c giorno di lavoro(da 0 a 30)", i + 1, 167);
      -->> scanf("%d", &ag[i].giornata[j]->data);
              inserisciVenduto(ag, i, j);
         }
         return;
    }

    Ho provato a passare doppi puntatori, a rendere "giornata" vettore di struct, o anche solo struct(ma a quel punto non va bene la malloc perche restituisce sempre un puntatore).
    L'idea è una serie di Agenti(chieste all'utente), per ogni agente una serie di giornate(chieste all'utente), per ogni giornata la quantità venduta di ognuno dei prodotti. Potrei farlo con le liste e credo sarebbe più comodo, ma vorrei risolverlo prima così.
    Se serve per testarlo posto tutto il codice.

  2. #2
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Puoi postare la implementazione di inserisciVenduto?
    Ho commentato la call nel codice ed inizializzato correttamente un puntatore ad Agente, stampando poi in output i dati inseriti.
    (Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u2 x86_64 GNU/Linux)

    Sembra che il problema risieda in quella call. O nel main. Hai provato a tracciare il codice con gdb?
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  3. #3
    Quote Originariamente inviata da infinitejustice Visualizza il messaggio
    Puoi postare la implementazione di inserisciVenduto?
    Ho commentato la call nel codice ed inizializzato correttamente un puntatore ad Agente, stampando poi in output i dati inseriti.
    (Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u2 x86_64 GNU/Linux)

    Sembra che il problema risieda in quella call. O nel main. Hai provato a tracciare il codice con gdb?
    Alla fine ho rivoluzionato tutto, ma vorrei capire dove stava il problema. Ti posto la funzione, ero convinto che il problema fosse nella scanf. Studio da poco e col debug non sono pratico per niente ed è un grosso limite.
    Gdb è un debugger per linux? Io uso devC++ e Codeblocks per Windows, ma adesso posso usare solo Dev.

    codice:
    void inserisciVenduto(Agente* ag, int i, int j) {
         int k;
         
         for(k = 0; k < N_PROD; k++) {
              printf("Quanto %s hai veduto il %d di questo mese? ", Prodotto[i].tipo, ag[i].giornata[j]->data);
              scanf("%d", &ag[i].giornata[j]->venduto.quantita[k]);
         }
         return;
    }
    Ultima modifica di caramelleamare; 10-01-2015 a 02:13

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.