2 votes

La valeur assignée dans le tableau change après avoir été assignée

Dans mon code, je dois construire une fonction qui va analyser le contenu d'un fichier et le transformer en structures. Le problème est que dans cette fonction en particulier, lors de la première boucle du while, la fonction résultats va avoir la bonne valeur dans le tableau titres mais dès que la nouvelle ligne est lue ( fgets(ligne, MAX_LINE_LENGTH, fichier) ), et la valeur de ligne change, la valeur dans résultats->titres change aussi. Je suis relativement novice en C et je n'arrive pas à comprendre pourquoi, car mes fonctions fonctionnent ailleurs. voir la fin de l'article ). J'ai l'impression que c'est lié à ma compréhension limitée des pointeurs, mais je n'arrive pas à trouver comment résoudre ce problème !

Si quelqu'un pouvait m'aider, ce serait très apprécié !

######## Code ########

structures : Je n'ai pas tout inclus mais les deux structures ont des getters et setters ainsi qu'un constructeur et destructeur.

struct titre {
    char* tconst;
    char* primaryTitle;
    char* genres;
    char* titleType;
    int startYear;
};
typedef struct titre* t_titre;

struct resultats {
    int size;
    t_titre titres;
};
typedef struct resultats* t_resultats;

t_titre creer_titre(void) {
    t_titre titre;

    titre = (t_titre) malloc(sizeof(struct titre));
    memset(titre, 0, sizeof(*titre));

    if (titre) {
        titre->tconst = NULL;
        titre->primaryTitle = NULL;
        titre->genres = NULL;
        titre->titleType = NULL;
        titre->startYear = -1;
    }

    return titre;
}
 ...

void set_tconst(t_titre titre, char* tconst) {
    titre->tconst = tconst;
}
 ...

La mise en œuvre ne fonctionne pas :

#include "imdb.h"
#define MAX_LINE_LENGTH 128

void parse_line(t_titre titre, char* line);
void filter_results(t_resultats results, t_critere filter);

t_resultats search_file(t_critere criteres, char* file_name) {
    FILE* file = fopen(file_name, "r");
    t_resultats resultats = creer_resultats();
    t_titre titre = creer_titre();

    if (file == NULL) {
        printf("Couldn't open file %s\n", file_name);
        exit(EXIT_FAILURE);
    }

    char line[MAX_LINE_LENGTH];
    fgets(line, MAX_LINE_LENGTH, file); //Skip header line 
    while (fgets(line, MAX_LINE_LENGTH, file)) {
        parse_line(titre, line);
        add_titre(resultats, titre);
    }

    free(titre);
    fclose(file);
    return NULL;
}

void parse_line(t_titre titre, char* line) {
    line[strcspn(line, "\n")] = 0; //Remove trailling \n

    set_tconst(titre, strsep(&line, "\t"));
    set_titleType(titre, strsep(&line, "\t"));
    set_primaryTitle(titre, strsep(&line, "\t"));
    strsep(&line, "\t"); //Skip originalTitle
    strsep(&line, "\t"); //Skip isAdult
    set_startYear(titre, strtol(strsep(&line, "\t"), NULL, 10));
    strsep(&line, "\t"); //Skip endYear
    strsep(&line, "\t"); //Skip runtimeMinutes
    set_genres(titre, line); //Use remaining of line as it is the last value
}

void filter_results(t_resultats results, t_critere filter) {

}

Mise en œuvre du travail :

    t_resultats resultats = creer_resultats();
    t_titre t = creer_titre();

    set_tconst(t, "tt0000001");
    set_titleType(t, "short");
    set_primaryTitle(t, "It");
    set_startYear(t, 2015);
    set_genres(t, "Horror,Short");
    add_titre(resultats, t);

    set_tconst(t, "tt0000002");
    set_titleType(t, "short");
    set_primaryTitle(t, "ET");
    set_startYear(t, 2015);
    set_genres(t, "Horror,Short");
    add_titre(resultats, t);

    set_tconst(t, "tt0000003");
    set_titleType(t, "short");
    set_primaryTitle(t, "Interstellar");
    set_startYear(t, 2015);
    set_genres(t, "Sci-Fi,Short");
    add_titre(resultats, t);

0voto

Quentin Levasseur Points 21

La réponse était simple, je devais modifier les méthodes setter afin d'allouer de la mémoire puis de copier la valeur :

Cette :

void set_tconst(t_titre titre, char* tconst) {
    titre->tconst = (char*) malloc(sizeof(tconst));
    strcpy(titre->tconst, tconst);
}

Au lieu de ça :

void set_tconst(t_titre titre, char* tconst) {
    titre->tconst = tconst;
}

Merci à tous !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X