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

    [C] Bug senza senso con una Struct

    Salve a tutti, ho un problema a dir poco curioso.

    Ho, nel mio codice, un tipo struct, formato in questo modo:

    codice:
    typedef struct elementMat {
        int riga;
        int numero;
        int colonna;
        struct elementMat *link;
    } elementMat;
    è la cella di una lista concatenata. Fin qui, tutto ok.

    Nel prosequio del codice, i campi degli oggetti del tipo struct vengono inizializzati tramite una lettura da file (con funzione fscanf).

    L'operazione riesce benissimo. Viene effettuata all'interno di un ciclo, fin quando ci sono ancora dati nel file.



    Il problema nasce al di fuori del ciclo, ed in generale della funzione che crea la lista concatenata.

    Quando si va ad accedere ai dati della lista, alcuni valori sono corretti ed altri (ad intervalli regolari) non lo sono.

    Esempio, i valori contenuti nei campi sono:

    codice:
    Numero Riga   Colonna
    1         2       3
    2         3       54234565
    3         1       2
    4         2       4144455
    e cosi via, considerando validi solo i valori n<5



    La cosa assurda è che, cambiando l'ordine degli elementi nella struct, il dato sballato risulta essere un altro (ad esempio riga), oppure , con alcune disposizioni degli elementi nella definizione della struct, il programma va in crash.


    Esempio di crash:

    codice:
    typedef struct elementMat {
        struct elementMat *link;
        int riga;
        int numero;
        int colonna;
    } elementMat;

    Secondo voi cosa causa questo strano comportamento? Non riesco a risolvere, perchè la cosa non ha alcun senso. Come è possibile che quei campi vengano sovrascritti? Mi sembra assurdo.


    Grazie anticipatamente.

  2. #2
    Posta il codice (ben indentato) della funzione che crea un nuovo nodo.
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  3. #3
    Grazie per la risposta,
    la funzione è questa; crea direttamente l'intera lista.

    Il tipo matriceADT è un puntatore ad una struct che contiene due puntatori, rispettivamente al primo elemento della lista ed all'ultimo.

    Il nome del file è passato come argomento.

    codice:
    elementMat *elementoPT;
    matriceADT matrice;
    FILE *fp;
    fp=fopen(file,"r");
    elementoPT=malloc(sizeof(elementMat *));
    if(elementoPT==NULL) {
        printf("\n\nMemoria indisponibile\n");
        exit(EXIT_FAILURE);
        }
    if(fscanf(fp,"%d %d %d",&elementoPT->riga,&elementoPT->colonna,&elementoPT->numero) !=EOF ) {
        elementoPT->link=NULL;
        }
    else {
        printf("\n***ERRORE***\nIl file contiene dati non validi\n");
        exit(EXIT_FAILURE);
        }
    matrice->primo=elementoPT;
    matrice->ultimo=matrice->primo;
    
    while(1) {
        elementoPT->link=malloc(sizeof(elementMat *));
        if(elementoPT->link==NULL) {
            printf("\n\nMemoria indisponibile\n");
            exit(EXIT_FAILURE);
            }
        elementoPT=elementoPT->link;
        elementoPT->link=NULL;
        if(fscanf(fp,"%d %d %d",&elementoPT->riga,&elementoPT->colonna,&elementoPT->numero) !=EOF) {
            matrice->ultimo=elementoPT;
        }
        else {
            matrice->ultimo->link=NULL; //altrimenti visualizza un'area di memoria in piu, che CMQ viene CREATA!!
            break;
        } 
    }
    
    fclose(fp);
    return(matrice);
    Leggendo i valori all'interno del ciclo while, subito dopo essere stati quindi inizializzati, sono corretti.

    Immediatamente fuori al ciclo, provando a leggerli, si ottengono dati sballati del campo "colonna", ma solo per termini "pari" (il secondo, il quarto,...) con questa particolare disposizione dei campi nella struct elementMat.


    Grazie

  4. #4
    Ho risolto, grazie a tutti.

    Non appena ho qualche minuto di tempo, posto la motivazione del problema.

    A più tardi

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 © 2024 vBulletin Solutions, Inc. All rights reserved.