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

    Funzione stampa lista di liste

    Ciao ragazzi,
    sono alle prese con la programmazione in c e ho qualche problema con la funzione stampa nella lista di liste.
    Il debug mi dice che c'è un errore di segmentazione e se provo ad eseguirlo si crasha!!
    mi sapete aiutare???

    vi posto il codice:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define LEN 30
    #define fcentraline "centraline.txt"
    
    typedef struct Atomodati{
          int ora;
          int min;
          char data[LEN];
          float temp;
          float press;
          float umid;
    }Atomodati,Tatomodati;
    
    typedef struct Lista_dati{
            Atomodati dato;
            struct Lista_dati *succ;
    }Lista_dati,*Tlista_dati;
    
    typedef struct Atomocentraline{
            int id;
            char ubicazione[LEN];
            int tipo;
            Tlista_dati dati_ril;
    }Atomocentraline,Tatomocentraline;
    
    typedef struct Lista_centraline{
            Atomocentraline dato;
            struct Lista_centraline *succ;
    }Lista_centraline,*Tlista_centraline;
    
    void cons(Tlista_centraline *l,Atomocentraline e)
    {
         Tlista_centraline tmp;
         tmp=(Tlista_centraline)malloc(sizeof(Lista_centraline));
         
         if(tmp==NULL)
         {
                      printf("errore 1 \n");
                      system("pause");
                      exit(-1);
         }
         
         tmp->dato=e;
         tmp->succ=*l;
         (*l)=tmp;
    }
    void cons2(Tlista_dati *l,Atomodati e)
    {
         Tlista_dati tmp;
         tmp=(Tlista_dati)malloc(sizeof(Lista_dati));
         
         if(tmp==NULL)
         {
                      printf("errore 2 \n");
                      system("pause");
                      exit(-1);
         }
         
         tmp->dato=e;
         tmp->succ=*l;
         (*l)=tmp;
    }
    
    
    void insord_dati(Tlista_dati *l,Atomodati e)
    {
         if(((*l)==NULL)||(strcmp((*l)->dato.data,e.data)<0)) cons2 (l,e);
         else insord_dati(&(*l)->succ,e);
    }
    
    void insord_centraline(Tlista_centraline *l,Atomocentraline e)
    {
         if(((*l)==NULL)||((*l)->dato.id<e.id)) cons (l,e);
         else insord_centraline(&(*l)->succ,e);
    }
    
    void carica_lista(Tlista_centraline *l)
    {
         Atomocentraline c;
         Atomodati d;
         FILE *fp;
         
         fp=fopen (fcentraline,"r");
         while (fscanf(fp,"%d",&c.id)!=EOF)
         {
               fgets(c.ubicazione,LEN,fp);
               c.ubicazione[strlen(c.ubicazione)-1]='\0';
               fscanf(fp,"%d",&c.tipo);
               c.dati_ril=NULL;
               cons (l,c);
               while(fscanf(fp,"%d",&d.ora)!=EOF)
               {
                   fscanf(fp,"%d",&d.min);
                   fgets(d.data,LEN,fp);
                   d.data[strlen(d.data)-1]='\0';
                   fscanf(fp,"%f",&d.temp);
                   fscanf(fp,"%f",&d.press);
                   fscanf(fp,"%f",&d.umid);
                   cons2(&((*l)->dato.dati_ril),d);
               }
         }printf("liste caricate\n");
              fclose(fp);
    }
    
    //data id e ora stampare tutte le ubicazioni 
    
    void stampa (Tlista_centraline l) {
    	int x,y;
    	Tlista_dati tmp;
    	printf ("inserisci id\n");
    	scanf ("%d",&x);
    	printf ("inserisci ora\n");
    	scanf ("%d",&y);
    	while (l!=NULL) {
    		tmp=l->dato.dati_ril;
    		if (l->dato.id==x && tmp->dato.ora==y)
    			printf ("ecco le ubicazioni che cercavi %d",l->dato.ubicazione);
    		l=l->succ;
    	}
    }
    
    int main()
    {
        
        Tlista_dati ld;
        Tlista_centraline lc;
        carica_lista(&lc);
        stampa(ld);
        system("pause");
        return 0;
    }
    Formattazione codice aggiunta da Alka

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Il linguaggio va indicato nel titolo, come da Regolamento, e il codice va formattato usando l'apposito tag [CODE].

    Qui ho aggiunto io entrambi, in futuro provvedi tu.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Ah grazie mille
    In futuro provvederò

  4. #4
    Perchè non mi risponde nessuno??
    Aiuto ragazzi tra qualche giorno ho il compito e il programma non và proprio

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    non ho eseguito il tuo codice, ma parto dall'errore e da quello che scrivi.
    L'errore è segmentation fault, fin'ora quando ho visto questo errore ho provato l'accesso a memoria non inizializzata oppure sono andata fuori dal mio spazio di esecuzione.

    Questa è la tua funzione di stampa

    codice:
    void stampa (Tlista_centraline l) {
    	int x,y;
    	Tlista_dati tmp;
    	printf ("inserisci id\n");
    	scanf ("%d",&x);
    	printf ("inserisci ora\n");
    	scanf ("%d",&y);
    	while (l!=NULL) {
    		tmp=l->dato.dati_ril;
    		if (l->dato.id==x && tmp->dato.ora==y)
    			printf ("ecco le ubicazioni che cercavi %d",l->dato.ubicazione);
    		l=l->succ;
    	}
    }
    guarda la funzione, il primo controllo è mettere delle printf prima di ogni istruzione (o debuggare) per sapere a che punto arrivi. Tipo questo


    codice:
    void stampa (Tlista_centraline l) {
    	int x,y;
    	Tlista_dati tmp;
    	printf ("inserisci id\n");
    	scanf ("%d",&x);
    	printf ("inserisci ora\n");
    	scanf ("%d",&y);
    printf("l'input l'ho preso\n");
    	while (l!=NULL) {
    printf("dentro ciclo prima di assegnare temp\n");
    		tmp=l->dato.dati_ril;
    printf("dentro ciclo dopo aver assegnato temp\n");
    		if (l->dato.id==x && tmp->dato.ora==y){
    
    			printf ("ecco le ubicazioni che cercavi %d",l->dato.ubicazione);
    }
    printf("dopo if\n");
    		l=l->succ;
    printf("ultima istruzione\n");
    	}
    }
    provi e vedi a che punto arrivi. La prima printf che non vedi ti fa capire che all'istruzione prima fai qualcosa che non devi.

    Secondo me la struttura che passi ha qualche valore a NULL (che non controlli)
    RTFM Read That F*** Manual!!!

  6. #6
    Così mi stampa tutto tranne la printf che a me interessava di più :

    printf ("ecco le ubicazioni che cercavi %d",l->dato.ubicazione);

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ok significa che uno dei due parametri che controlli non è valorizzato,prova a mettere
    codice:
    if (l->dato.id==x && tmp->dato.ora==y){
    quindi è questa che lo manda in botta.
    Allora controlla che

    x sia valorizzato
    y sia valorizzato
    l->dato.id sia valorizzato
    tmp->dato.ora sia valorizzato

    banalmente farei una printf di questi valori
    In generale in questi casi devi controllare che alla riga prima della printf che non vedi sia tutto valorizzato e valorizzato correttamente
    RTFM Read That F*** Manual!!!

  8. #8
    scusa l'ignoranza, ma cosa intendi per valorizzati??
    non gli assegno un valore nel momento in cui pongo l->dato.id==x e tmp->dato.ora==y ??
    cosa dovrei fare?

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    valorizzati == che tu gli abbia assegnato un valore.

    No, qui fai un controllo

    l->dato.id==x

    ti chiedi se il valore di x sia uguale (==) a quello di l->dato.id.

    non confondere l'operatore di assegnamento e quello di confronto
    RTFM Read That F*** Manual!!!

  10. #10
    ah grazie
    però ho provato a mettere int x e int y = 0 ma nn appare neanke facendo così .
    Come mi consigli di valorizzarli?

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.