Struct

di il
15 risposte

Struct

Definisco le strutture:

struct autom{
   int targa;
   int strada_arrivo;
};

struct rotatoria{
   struct autom * autom_rot;
   int posizione;
   struct rotatoria * next;
};

struct coda{
   struct autom * auto_strada;
   struct coda * next;
   struct coda * testa;
   struct coda * ultimo;
   struct rotatoria * collegamento;
};

struct strada{
   int nome;
   struct coda *attesa;
};

struct istante{
   struct rotatoria * rotat_ist;
   struct strada * stradat[5];
   int momento;
};
il mio problema è:
quando vado a prendermi un elemento della lista di tipo rotatoria, e lo voglio mettere in collegamento mi da errore.
iniziale è una struct di tipo istante che contiene sia la struct rotatoria e sia la struct coda. ho allocato tutto all'inizio del main.

struct istante * iniziale;
   iniziale = (struct istante*) malloc(sizeof(struct istante));
   iniziale->rotat_ist = (struct rotatoria*) malloc(sizeof(struct rotatoria));
   for(c=0;c<=5;c++){
      iniziale->stradat[c] = (struct strada*) malloc(sizeof(struct strada));
      iniziale->stradat[c]->nome = c; 
      iniziale->stradat[c]->attesa = (struct coda *) malloc(sizeof(struct coda)); 
      iniziale->stradat[c]->attesa = NULL;          
   }

la parte incriminata è questa:

iniziale->stradat[0]->attesa->collegamento=iniziale->rotat_ist
aiutatemi vi prego!!!

15 Risposte

  • Re: Struct

    Confesso di non averci capito niente
    Comunque secondo me nel ciclo su c
    iniziale->stradat[c]->attesa = (struct coda *) malloc(sizeof(struct coda));
    iniziale->stradat[c]->attesa = NULL; 
    non ha senso settare a NULL un puntatore che hai allocato in precedenza, senza prima aver deallocato la memoria o averla assegnata ad un altro puntatore.
  • Re: Struct

    So di essere stato poco chiaro comunque credo di aver capito l'errore in pratica non riesco ad allocare memoria per questo campo
    iniziale->stradat[]->attesa->collegamento
    tutto si alloca normalmente quando vado ad allocare questo campo o inserire qualcosa qua si blocca tutto
  • Re: Struct

    Non riesci a lavorare con 'collegamento' perchè 'attesa' è settato a NULL:
    iniziale->stradat[c]->attesa = NULL;
  • Re: Struct

    Se metto attesa = NULL c'è un caso in cui riesco a lavorare con collegamento se invece tolgo attesa = NULL non funziona proprio
  • Re: Struct

    Impostare attesa a NULL dopo averlo allocato non ha alcun senso. Come puoi accedere alla memoria che hai appena allocato se setti il puntatore a NULL?
    Secondo me devi rimuovere quell'assegnazione, anche se nei tuoi tentativi ha generato una condizione quasi funzionante.
    Fatto questo, prima dell'istruzione incriminata devi stampare a video (con una printf()) il valore dei vari puntatori es.:
    printf( "iniziale %d\n", (int)iniziale);
    printf( "iniziale->stradat[0]%d\n", (int)iniziale->stradat[0]);
    printf( "iniziale->stradat[0]->attesa%d\n", (int)iniziale->stradat[0]->attesa);
    Se prima fai una printf di ciascun puntatore allocato, puoi verificare se corrispondono
       iniziale = (struct istante*) malloc(sizeof(struct istante));
       printf( "iniziale %d\n", (int)iniziale);
       iniziale->rotat_ist = (struct rotatoria*) malloc(sizeof(struct rotatoria));
       printf( " iniziale->rotat_ist %d\n", (int) iniziale->rotat_ist);
       for(c=0;c<=5;c++){
          iniziale->stradat[c] = (struct strada*) malloc(sizeof(struct strada));
          printf( " iniziale->stradat[%d] %d\n", c, (int)iniziale->stradat[c]);
          iniziale->stradat[c]->nome = c;
          iniziale->stradat[c]->attesa = (struct coda *) malloc(sizeof(struct coda));
          printf( "iniziale->stradat[%d]->attesa %d\n", c, (int)iniziale->stradat[c]->attesa);
       }
  • Re: Struct

    Ho capito quelle che dici ed ho tolto l'assegnazione = NULL però non riesco a capire perchè non riesco ad accedere a collegamento
  • Re: Struct

    Io non ti ho dato una soluzione o una spiegazione; ti ho solo suggerito un sistema per poter capire perchè non accedi a 'collegamento'. Hai provato quello che ti ho suggerito di fare?
  • Re: Struct

    Si se hai letto prima ti ho detto che ho provato a togliere attesa = NULL e mi crashava tutto
  • Re: Struct

    Si se hai letto prima ti ho detto che ho provato a togliere attesa = null e mi crashava tutto
  • Re: Struct

    struct strada * stradat[5];
    Dichiari un vettore di 5 puntatori
    e invece ne usi 6
    for(c=0;c<=5;c++){
    naturalmente sempre che la matematica non sia diventata un'opinione.
    Ricordo che il numero dentro alle parentesi quadre è il numero degli elementi e non dell'ultimo elemento come avviene nel visual basic.
    Quindi 5 nel c andrà da 0-4
    for(c=0;c<5;c++){
    iniziale->stradat[c]->attesa = (struct coda *) malloc(sizeof(struct coda));
          iniziale->stradat[c]->attesa = NULL;
    non esiste motivazione per controbattere il suggerimento prima dato!
    è un gravissimo errore settare a null un puntatore appena allocato,pena memory leak.

    togliendo quindi anche quella riga finisci di togliere anche l'ultimo errore del codice appena postato.
    In caso non funzionasse ancora allora sarà il caso di postare il codice completo o di farsi dare la sacra unzione dal santo preferito
  • Re: Struct

    Sono d'accordo con tutto quello che hai detto ma mettere quella variabile a NULL non mi fa crashare il codice mi sai dire il perchè?
  • Re: Struct

    Ti è stato detto che mettere quella variabile a NULL causa memory leak non crash
  • Re: Struct

    sono d'accordo con tutto quello che hai detto ma mettere quella variabile a NULL non mi fa crashare il codice mi sai dire il perchè?
    si!
    Oggi però sono stanco e la mia forza telepatica scarseggia,non è che posteresti tutto il codice cosi che ti possiamo aiutare?
    Il codice che hai postato te l'ho già corretto e quindi se hai errori è da ricercare in qualche altra parte del codice,fai prima a postare tutto.
  • Re: Struct

    Non l'ho postato perchè è lungo ma se mi dite che posso provvedo subito
    main:
    
    int main(int argc, char *argv[])
    {  
       HANDLE hConsole;
       hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
       int z,i,c,scelta;
       int cont = 0;
       int cont_macc_rot = 0;//variabile usata per sapere il numero di macchine presenti sulla rotonda 
       int targa;//variabile usate per leggere da file la targa dell auto
       int posizione_e;//variabile usata per leggere da file dove si trova l' auto inizialmente
       int strada_u;//variabile usata per indicare la strada di uscita che l' auto vuole prendere
       struct istante * iniziale=NULL;
       iniziale = (struct istante*) malloc(sizeof(struct istante));
       iniziale->rotat_ist = (struct rotatoria*) malloc(sizeof(struct rotatoria));
       for(c=0;c<5;c++){
          iniziale->stradat[c] = (struct strada*) malloc(sizeof(struct strada));
          iniziale->stradat[c]->nome = c; 
          iniziale->stradat[c]->attesa = (struct coda *) malloc(sizeof(struct coda )); 
      
        iniziale->stradat[c]->attesa->collegamento=(struct rotatoria *)malloc(sizeof(struct coda));
       }
         
       iniziale->rotat_ist=crearotatoria(iniziale->rotat_ist);
       FILE* file = fopen ("macchine.txt","r");
       if(file != NULL ){
          while(!feof(file)){
             if ((fscanf(file,"%d" ,&targa)>=0) &&(fscanf(file,"%d",&posizione_e)>=0) && (fscanf(file,"%d",&strada_u)>=0)){
                if((posizione_e >= 0) && (posizione_e < 15) && (cont_macc_rot <= 15) && (targa != 0)){
                   printf("\n%d",posizione_e);             
                   if(!(metti_in_rotonda(iniziale->rotat_ist, targa, posizione_e, strada_u )))
                      printf("macchina con targa: %d non inserita perche la posizione %d e' gia' occupata",targa,posizione_e);
                   else   
                      cont_macc_rot++; 
                        
                }
                if((posizione_e >= 15) && (posizione_e < 19) && (targa != 0)){
                   switch(posizione_e){
                      case 15:
                         iniziale->stradat[0]->attesa = ins_coda(iniziale->stradat[0]->attesa,targa,strada_u);  
                         break;
                      case 16:
                         iniziale->stradat[1]->attesa = ins_coda(iniziale->stradat[1]->attesa,targa,strada_u);
                         break;
                      case 17:
                         iniziale->stradat[2]->attesa = ins_coda(iniziale->stradat[2]->attesa,targa,strada_u);
                         break;
                      case 18:
                         iniziale->stradat[3]->attesa= ins_coda(iniziale->stradat[3]->attesa,targa,strada_u);
                         break;
                      case 19:
                         iniziale->stradat[4]->attesa = ins_coda(iniziale->stradat[4]->attesa,targa,strada_u);
                         break;    
                   } 
                }                          
             }
          }
          printf("\n");
          fclose(file);   
       }else
          fputs ("File impossibile da aprire\n",stderr);
    
    funzioni:
    
    struct rotatoria * crearotatoria(struct rotatoria * top){
       struct rotatoria *p,*last;
       int i;
       top = NULL;
       for(i=0;i<15;i++){
          p = (struct rotatoria*)malloc(sizeof(struct rotatoria));
          if(i==0)
       last = p;
          p->autom_rot = (struct autom*)malloc(sizeof(struct autom));
          p->autom_rot->targa = 0;
          p->autom_rot->strada_arrivo = 0;
          p->posizione = 14-i;
          p->next=top;
          top = p;
       }
       last->next = top ;  
       return(top);
    }
    
    int metti_in_rotonda(struct rotatoria * rot,int targa, int pos_e, int str_u){
       if(rot->posizione == pos_e){
          if(rot->autom_rot->targa == 0){                              
             rot->autom_rot->targa = targa;
             rot->autom_rot->strada_arrivo = str_u;
             return 1;
          }
          else
             return 0;    
       }
       else
          return metti_in_rotonda(rot->next, targa, pos_e, str_u);
    }
    
    struct coda * crea(int targa,int uscita){
       struct coda * appoggio = (struct coda*)malloc(sizeof(struct coda));
       appoggio->auto_strada = (struct autom*)malloc(sizeof(struct autom));
       appoggio->auto_strada->targa = targa;
       appoggio->auto_strada->strada_arrivo = uscita;
       appoggio->next=NULL;
       appoggio->collegamento=(struct rotatoria *)malloc(sizeof(struct rotatoria));
       return appoggio;   
    }
    
    struct coda * ins_coda(struct coda * via,int targa,int strada_u){
       if(via == NULL)
          via= crea(targa,strada_u);
       else
          via->next = ins_coda(via->next,targa,strada_u);
       return via;           
    }
    
    grazie per la pazienza
Devi accedere o registrarti per scrivere nel forum
15 risposte