IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème Récupération de données en C


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Problème Récupération de données en C
    Bonjour à tous ! Je ne suis pas un spécialiste du C, si mon erreur est stupide, c'est que je suis stupide x)
    Voici mon problème, je souhaite récupérer des données triées dans un fichier .txt et les stocker dans des variables, tableaux, variables de structures etc. Ce sont des données représentatives de lignes ferroviaires pour Trains. Voici comment sont organisées mes données:
    Ceci est mon fichier "Informations.txt" , l'original est sans les commentaires style C, je les ai rajouté pour que vous compreniez :
    10 //nombre de villes
    383 886 777 915 793 335 386 492 649 763 926 540 426 172 736 874 125 698 187 265 //coordonnées des villes
    2 //nombre de lignes sur tout le réseau
    3 //nombre de villes dans la première ligne
    1 0 9 //villes de la première ligne
    2 //nombre de passages journalier
    14h44 18h41 21h16 //horaires du 1er passage
    03h30 07h27 10h02 //horaires du 2è passage
    3
    3 8 6
    3
    20h33 22h13 02h10
    05h02 06h42 10h39
    12h50 14h30 18h27
    Mon gros problème c'est que j'arrive à afficher correctement mes données au fil de l'opéation directement après stockage, mais quand je veux réaccéder à mes valeurs plus tard, les données sont perdus partiellement. Voici une illustration de mon problème :
    Ici tout marche bien lors que j’utilise ma fonction void LectureDonnees : Il s'agit de l'affichage sur le TERMINAL :
    Il y'a 10 villes
    Les coordonnées de la ville sont 383 886
    Les coordonnées de la ville sont 777 915
    Les coordonnées de la ville sont 793 335
    Les coordonnées de la ville sont 386 492
    Les coordonnées de la ville sont 649 763
    Les coordonnées de la ville sont 926 540
    Les coordonnées de la ville sont 426 172
    Les coordonnées de la ville sont 736 874
    Les coordonnées de la ville sont 125 698
    Les coordonnées de la ville sont 187 265
    Il y'a 2 lignes
    Il y'a 3 villes sur la ligne 0
    Il y'a la ville n° 1
    Il y'a la ville n° 0
    Il y'a la ville n° 9
    Il y'a 2 passages journaliers sur cette ligne
    Voici le passage n° 0
    14 heures et 44 minutes
    18 heures et 41 minutes
    21 heures et 16 minutes
    Voici le passage n° 1
    3 heures et 30 minutes
    7 heures et 27 minutes
    10 heures et 2 minutes
    Il y'a 3 villes sur la ligne 1
    Il y'a la ville n° 3
    Il y'a la ville n° 8
    Il y'a la ville n° 6
    Il y'a 3 passages journaliers sur cette ligne
    Voici le passage n° 0
    20 heures et 33 minutes
    22 heures et 13 minutes
    2 heures et 10 minutes
    Voici le passage n° 1
    5 heures et 2 minutes
    6 heures et 42 minutes
    10 heures et 39 minutes
    Voici le passage n° 2
    12 heures et 50 minutes
    14 heures et 30 minutes
    18 heures et 27 minutes
    Mais une fois que je tente de réaccéder à ces données avec la fonction main, les données sont en partie erronée, pas toutes :
    Le diagnostic est que le programme semble se tromper en récupérant le numéro des villes à un moment donnée et réussit correctement après , et il semble écraser les horaires précédentes des lignes.
    Les coordonnées de la ville sont 383 886
    Les coordonnées de la ville sont 777 915
    Les coordonnées de la ville sont 793 335
    Les coordonnées de la ville sont 386 492
    Les coordonnées de la ville sont 649 763
    Les coordonnées de la ville sont 926 540
    Les coordonnées de la ville sont 426 172
    Les coordonnées de la ville sont 736 874
    Les coordonnées de la ville sont 125 698
    Les coordonnées de la ville sont 187 265
    Il y'a 3 villes sur la ligne 0
    Il y'a la ville n° 1
    Il y'a la ville n° 3 -----------------------------------> se trompe en prenant les villes à partir d'ici
    Il y'a la ville n° 37715008
    Il y'a 2 passages journaliers sur cette ligne
    Voici le passage n° 0
    37714496 heures et 0 minutes
    37714624 heures et 0 minutes -------> Horaires erronées
    37714752 heures et 0 minutes
    Voici le passage n° 1
    3 heures et 30 minutes
    7 heures et 27 minutes -------------> Horaires correctes
    10 heures et 2 minutes
    Il y'a 3 villes sur la ligne 1
    Il y'a la ville n° 3
    Il y'a la ville n° 8 -----------------> Réussit à récupérer les villes
    Il y'a la ville n° 6
    Il y'a 3 passages journaliers sur cette ligne
    Voici le passage n° 0
    37716544 heures et 0 minutes
    37716672 heures et 0 minutes ---------------> ERREUR horraire
    37716800 heures et 0 minutes
    Voici le passage n° 1
    37716576 heures et 0 minutes
    37716704 heures et 0 minutes ----------------> ERREUR horaire
    37716832 heures et 0 minutes
    Voici le passage n° 2
    12 heures et 50 minutes
    14 heures et 30 minutes -------------------> horaire correcte
    18 heures et 27 minutes
    J'ai cherché à trouver ma boulette, sans succès, quelque chose ne devrait pas aller avec mes malloc, fscanf, ou alors je me suis gourer dans les indices d'une boucle for, à vrai dire je ne sais vraiment pas ...
    Voici mon code source du programme "utils.c" que j'ai compiler simplement avec gcc utils.c -o
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
     
    /*
     * utils.c
     *
     *  Created on: 21 janv. 2017
     *      Author: totor
     */
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int nb_villes; //nombres de villes
    int nb_lignes; //nombre lignes de trains
     
    typedef struct Horaire Horaire;
    struct Horaire {  // structure d'une Horaire
    	int heures;
    	int minutes;
    };
     
    typedef struct Coordonnees Coordonnes;
    struct Coordonnees {  // structure de coordonnées
    	int abscisse;
    	int ordonnee;
    };
     
    typedef struct Villa Villa;
    struct Villa {  // structure d'une ville
    	Coordonnes position;
    };
    Villa *ListeVille;
     
    typedef struct Ligne Ligne;
    struct Ligne {  // structure d'une ligne
    	int identifiant;
    	int nb_villes_ligne;
    	int* TableauVilleSurLigne;
    	int nb_passage_sur_ligne;
    	Horaire** ListeHoraire;  //Liste Horaire[num passage][Liste Horaire] ??
    };
    Ligne *ListeLigne;
     
    void affiche_coordonnees_ville(int NumeroVille, Villa ville[]) {
    	printf("Les coordonnées de la ville %d sont %d %d \n", NumeroVille,
    			ville[NumeroVille].position.abscisse,
    			ville[NumeroVille].position.ordonnee);
    }
     
    void LectureDonnees() {
     
    	FILE *infos; //pointeur vers fichiers
     
    	infos = fopen("Informations.txt", "r"); //mettre chemin relatifs si nécessaire
    	if (infos == NULL) {
    		printf(
    				"Erreur d'ouverture du fichier ou 'Informations.txt' manquant \n");
    		exit(1);
    	}
     
    	else {
    		fscanf(infos, "%d", &nb_villes); // récupère le nombre de villes sur tout le réseau ferroviaire
    		printf("Il y'a %d villes \n", nb_villes);
     
    		ListeVille = (Villa*) malloc(nb_villes * 2 * sizeof(int)); // x2 car Coordonnées double --- x et y ????
    		for (int i = 0; i < nb_villes; i++) {
    			fscanf(infos, "%d %d", &ListeVille[i].position.abscisse,
    					&ListeVille[i].position.ordonnee); //récupère coordonnées des villes
    			printf("Les coordonnées de la ville sont %d %d \n",
    					ListeVille[i].position.abscisse,
    					ListeVille[i].position.ordonnee);
    		}
     
    		fscanf(infos, "%d", &nb_lignes); // affiche le nombre de lignes de train
    		printf("Il y'a %d lignes \n", nb_lignes);
     
    		ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(int));
    		for (int i = 0; i < nb_lignes; i++) {
     
    			fscanf(infos, "%d", &ListeLigne[i].nb_villes_ligne); //récupère nombres de villes sur la ligne
    			printf("Il y'a %d villes sur la ligne %d\n",
    					ListeLigne[i].nb_villes_ligne, i);
     
    			ListeLigne[i].TableauVilleSurLigne = (int*) malloc(
    					(ListeLigne[i].nb_villes_ligne) * sizeof(int)); // On alloue le nécessaire
    			for (int k = 0; k < ListeLigne[i].nb_villes_ligne; k++) {
    				fscanf(infos, "%d", &ListeLigne[i].TableauVilleSurLigne[k]); //récupère identifiants des villes sur la ligne
    				printf("Il y'a la ville n° %d\n",
    						ListeLigne[i].TableauVilleSurLigne[k]);
    			}
     
    			fscanf(infos, "%d", &ListeLigne[i].nb_passage_sur_ligne); //récupère le nombre de passage sur cette ligne
    			printf("Il y'a %d passages journaliers sur cette ligne\n",
    					ListeLigne[i].nb_passage_sur_ligne);
     
    			for (int l = 0; l < ListeLigne[i].nb_passage_sur_ligne; l++) {
    				printf("Voici le passage n° %d \n", l);
     
    				ListeLigne[i].ListeHoraire = (Horaire**) malloc(
    						sizeof(&ListeLigne[i].ListeHoraire)
    								* ListeLigne[i].nb_passage_sur_ligne); //allocation tableau double dimension
    				for (int compt = 0; compt < 20; compt++)
    					ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(
    							sizeof(**ListeLigne[i].ListeHoraire)
    									* ListeLigne[i].nb_villes_ligne);
     
    				for (int j = 0; j < ListeLigne[i].nb_villes_ligne; j++) {
    					fscanf(infos, "%dh%d",
    							&ListeLigne[i].ListeHoraire[j][l].heures,
    							&ListeLigne[i].ListeHoraire[j][l].minutes); //récupère les horaires journalières
    					printf("%d heures et %d minutes\n",
    							ListeLigne[i].ListeHoraire[j][l].heures,
    							ListeLigne[i].ListeHoraire[j][l].minutes);
    				}
    			}
     
    		}
    	}
     
    }
     
    int main() {
    	LectureDonnees();
    	printf(
    			"--------------------------------------------------------------------------\n ---------------------- \n ------------------------\n");
    	for (int i = 0; i < nb_villes; i++) {
    		printf("Les coordonnées de la ville sont %d %d \n",
    				ListeVille[i].position.abscisse,
    				ListeVille[i].position.ordonnee);
    	}
     
    	for (int i = 0; i < nb_lignes; i++) {
    		printf("Il y'a %d villes sur la ligne %d\n",
    				ListeLigne[i].nb_villes_ligne, i);
     
    		for (int k = 0; k < ListeLigne[i].nb_villes_ligne; k++) {
    			printf("Il y'a la ville n° %d\n",
    					ListeLigne[i].TableauVilleSurLigne[k]);
    		}
     
    		printf("Il y'a %d passages journaliers sur cette ligne\n",
    				ListeLigne[i].nb_passage_sur_ligne);
     
    		for (int l = 0; l < ListeLigne[i].nb_passage_sur_ligne; l++) {
    			printf("Voici le passage n° %d \n", l);
     
    			for (int j = 0; j < ListeLigne[i].nb_villes_ligne; j++) {
    				printf("%d heures et %d minutes\n",
    						ListeLigne[i].ListeHoraire[j][l].heures,
    						ListeLigne[i].ListeHoraire[j][l].minutes);
    			}
    		}
     
    	}
    	return 0;
    }
    Pourriez-vous me dire d'abord à première vue, d'où pourrait bien venir le problème.
    Merci de votre aide,

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A priori, ca sent les variables non initialisées, ou des pointeurs invalides.

    Et je m'insurge contre ton introduction.
    Tu n'es pas stupide, puisque tu viens poser ta question.

    D'une manière générale, prends le temps de séparer ton problème en petites fonctions.

    Ta fonction LectureDonnees passe un tiers du temps à lire le fichier, un tiers à interpréter ce qui est écrit, et un tiers à manipuler la mémoire.
    Répartis le travail en plusieurs (groupe de) fonctions:
    1. analyse d'un fragment de fichier
    2. construction d'un élément de la liste
    3. gestion de la liste en elle meme

    Tu ne devrais pas avoir dans la même boucle un malloc, un accès à un élément de la liste, et l'accès un champ de cet élément.

    le malloc est une initialisation, fais une fonction d'initialisation. la taille des éléments est une information interne à cette fonciton.
    l'accès se ferait avec des fonctions dédiées (initialiser_element, par exemple).

    Et ce, à chaque structure et liste.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par ternel Voir le message
    A priori, ca sent les variables non initialisées, ou des pointeurs invalides.

    Et je m'insurge contre ton introduction.
    Tu n'es pas stupide, puisque tu viens poser ta question.

    D'une manière générale, prends le temps de séparer ton problème en petites fonctions.

    Ta fonction LectureDonnees passe un tiers du temps à lire le fichier, un tiers à interpréter ce qui est écrit, et un tiers à manipuler la mémoire.
    Répartis le travail en plusieurs (groupe de) fonctions:
    1. analyse d'un fragment de fichier
    2. construction d'un élément de la liste
    3. gestion de la liste en elle meme

    Tu ne devrais pas avoir dans la même boucle un malloc, un accès à un élément de la liste, et l'accès un champ de cet élément.

    le malloc est une initialisation, fais une fonction d'initialisation. la taille des éléments est une information interne à cette fonction.
    l'accès se ferait avec des fonctions dédiées (initialiser_element, par exemple).

    Et ce, à chaque structure et liste.
    Merci pour le conseil , je voulais faire une fonction void Lecture Donnees() qui soit compacte en un bloc, car sinon j'aurai fait plein de fonctions sans arguments du style void RécupérerNombreville(){... voidConstruireBidul(){... void RécupérerBiduleChouette(){... j'avais flemme d'écrire, c'est pour ça que j'ai mis les commentaires pour représenter chaque étapes dans la fonction. Autrement, je prend soin de diviser en plusieurs fonctions en général.
    Si j'ai bien compris ce que tu m'as dit, mon problème pourrait venir d'un problème d'initialisation ou de pointeurs invalides, je ne saisis pas trop
    Pour le problème d'initialisation, j'aurais pu utiliser la fonction calloc pour tout initialiser à 0, mais je ne pense pas que cela résolve mon problème. En revanche, ta remarque sur les pointeurs erronés me semble très interessante, je creuse de ce côté pendant un moment. Merci pour ton aide.
    Si quelqu'un d'autres a une remarque ou a trouvé ce qui va pas dans mon code je suis preneur

  4. #4
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Hello,

    -1-

    Tu devrais remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeVille = (Villa*) malloc(nb_villes * 2 * sizeof(int));
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeVille = (Villa*) malloc(nb_villes * sizeof(Villa));
    ... car tu ne peux pas garantir que le compilateur alloue strictement 2*sizeof(int) à ta structure "Villa". Et puis si tu ajoutes des éléments dans ta structure, tu risques d'oublier de changer la taille de ton allocation.

    -2-

    Du coup, même remarque pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(int));
    A remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(Ligne));
    ... et du coup il y a des chances que ton problème viennent d'ici, car ta structure "Ligne" est en réalité beaucoup plus grosse que la taille d'un 'int'.

    -3-

    Et puis ensuite, je crois que tu devrais remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire = (Horaire**) malloc(sizeof(&ListeLigne[i].ListeHoraire) * ListeLigne[i].nb_passage_sur_ligne)
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire = (Horaire**) malloc( sizeof(Horaire*) * ListeLigne[i].nb_passage_sur_ligne)
    ... mais je ne comprends pas pourquoi cette allocation est à l'intérieur de la boucle, ça ne me semble pas normal.

    -4-
    La ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int compt = 0; compt < 20; compt++)
    ... je me demande pourquoi '20' et non pas 'ListeLigne[i].nb_villes_ligne'

    -5-

    Il me semble que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(**ListeLigne[i].ListeHoraire)* ListeLigne[i].nb_villes_ligne);
    devrait plutôt être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(Horaire));
    -6-

    Faire des 'malloc' c'est bien, mais faire les 'free' qui vont avec, c'est mieux!

  5. #5
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Vérifie le bon déroulement des opérations. Il n'y a pas de magie, si tu ne testes pas les informations renvoyées par les appels système que tu utilises (malloc, fscanf..) tu peux tout aussi bien jouer à la roulette russe.

    Compile avec les avertissements : -pedantic -Wall -Wextra et même -Werror.

    Ne caste pas le pointeur retourné par malloc.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par nnovic Voir le message
    Hello,

    -1-

    Tu devrais remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeVille = (Villa*) malloc(nb_villes * 2 * sizeof(int));
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeVille = (Villa*) malloc(nb_villes * sizeof(Villa));
    ... car tu ne peux pas garantir que le compilateur alloue strictement 2*sizeof(int) à ta structure "Villa". Et puis si tu ajoutes des éléments dans ta structure, tu risques d'oublier de changer la taille de ton allocation.

    -2-

    Du coup, même remarque pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(int));
    A remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(Ligne));
    ... et du coup il y a des chances que ton problème viennent d'ici, car ta structure "Ligne" est en réalité beaucoup plus grosse que la taille d'un 'int'.

    -3-

    Et puis ensuite, je crois que tu devrais remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire = (Horaire**) malloc(sizeof(&ListeLigne[i].ListeHoraire) * ListeLigne[i].nb_passage_sur_ligne)
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire = (Horaire**) malloc( sizeof(Horaire*) * ListeLigne[i].nb_passage_sur_ligne)
    ... mais je ne comprends pas pourquoi cette allocation est à l'intérieur de la boucle, ça ne me semble pas normal.

    -4-
    La ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int compt = 0; compt < 20; compt++)
    ... je me demande pourquoi '20' et non pas 'ListeLigne[i].nb_villes_ligne'

    -5-

    Il me semble que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(**ListeLigne[i].ListeHoraire)* ListeLigne[i].nb_villes_ligne);
    devrait plutôt être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(Horaire));
    -6-

    Faire des 'malloc' c'est bien, mais faire les 'free' qui vont avec, c'est mieux!
    Oh merci pour le big up, je me sens un peu con ^^ pour certaines erreur. ça c'est ce qui arrive quand on reprend le C d'un coup je vais tester tout ça et je vous montrerai tous mes résultats.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Vérifie le bon déroulement des opérations. Il n'y a pas de magie, si tu ne testes pas les informations renvoyées par les appels système que tu utilises (malloc, fscanf..) tu peux tout aussi bien jouer à la roulette russe.

    Compile avec les avertissements : -pedantic -Wall -Wextra et même -Werror.

    Ne caste pas le pointeur retourné par malloc.
    c'est vrai que ça peut m'aider pour le débuggage, j'avais oublié. merci

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par nnovic Voir le message
    Hello,

    -1-

    Tu devrais remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeVille = (Villa*) malloc(nb_villes * 2 * sizeof(int));
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeVille = (Villa*) malloc(nb_villes * sizeof(Villa));
    ... car tu ne peux pas garantir que le compilateur alloue strictement 2*sizeof(int) à ta structure "Villa". Et puis si tu ajoutes des éléments dans ta structure, tu risques d'oublier de changer la taille de ton allocation.

    -2-

    Du coup, même remarque pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(int));
    A remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(Ligne));
    ... et du coup il y a des chances que ton problème viennent d'ici, car ta structure "Ligne" est en réalité beaucoup plus grosse que la taille d'un 'int'.

    -3-

    Et puis ensuite, je crois que tu devrais remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire = (Horaire**) malloc(sizeof(&ListeLigne[i].ListeHoraire) * ListeLigne[i].nb_passage_sur_ligne)
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire = (Horaire**) malloc( sizeof(Horaire*) * ListeLigne[i].nb_passage_sur_ligne)
    ... mais je ne comprends pas pourquoi cette allocation est à l'intérieur de la boucle, ça ne me semble pas normal.

    -4-
    La ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int compt = 0; compt < 20; compt++)
    ... je me demande pourquoi '20' et non pas 'ListeLigne[i].nb_villes_ligne'

    -5-

    Il me semble que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(**ListeLigne[i].ListeHoraire)* ListeLigne[i].nb_villes_ligne);
    devrait plutôt être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(Horaire));
    -6-

    Faire des 'malloc' c'est bien, mais faire les 'free' qui vont avec, c'est mieux!
    Bon, j'ai appliqué tes changements @nnovic . Et j'ai résolut une partie du problème, il récupère désormais correctement le numéro des villes, à cause du fait que j'ai utilisé malloc avec la taille d'un int et non de Ligne.
    Par contre, les horaires sont toujours erronées Il semble que j'écrase toujours les horaires précédentes. Je commence à ressaisir le fonctionnement de l'allocation, ça faisait longtemps que j'avais plus utilisé, un new en C++ ou Java c'est plus simple ^^
    Je continue à creuser le problème, en tout cas les paramètres -pedantic -wall etc que m'a donnée @Matt_Houston n'ont fait aucun Warning. Je suis en train de regardé si mon code switche bien les indices et ne piétinne pas mes données précèdentes.

    Voici le code changé comme dit, si j'ai bien appliqué tes changements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
     
    /*
     * utils.c
     *
     *  Created on: 21 janv. 2017
     *      Author: totor
     */
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int nb_villes; //nombres de villes
    int nb_lignes; //nombre lignes de trains
     
    typedef struct Horaire Horaire;
    struct Horaire {  // structure d'une Horaire
    	int heures;
    	int minutes;
    };
     
    typedef struct Coordonnees Coordonnes;
    struct Coordonnees {  // structure de coordonnées
    	int abscisse;
    	int ordonnee;
    };
     
    typedef struct Villa Villa;
    struct Villa {  // structure d'une ville
    	Coordonnes position;
    };
    Villa *ListeVille;
     
    typedef struct Ligne Ligne;
    struct Ligne {  // structure d'une ligne
    	int identifiant;
    	int nb_villes_ligne;
    	int* TableauVilleSurLigne;
    	int nb_passage_sur_ligne;
    	Horaire** ListeHoraire;  //Liste Horaire[num passage][Liste Horaire] ??
    };
    Ligne *ListeLigne;
     
    void affiche_coordonnees_ville(int NumeroVille, Villa ville[]) {
    	printf("Les coordonnées de la ville %d sont %d %d \n", NumeroVille,
    			ville[NumeroVille].position.abscisse,
    			ville[NumeroVille].position.ordonnee);
    }
     
    void LectureDonnees() {
     
    	FILE *infos; //pointeur vers fichiers
     
     
     
    	infos = fopen("Informations.txt", "r"); //mettre chemin relatifs si nécessaire
    	if (infos == NULL) {
    		printf(
    				"Erreur d'ouverture du fichier ou 'Informations.txt' manquant \n");
    		exit(1);
    	}
     
    	else {
    		fscanf(infos, "%d", &nb_villes); // récupère le nombre de villes sur tout le réseau ferroviaire
    		printf("Il y'a %d villes \n", nb_villes);
     
    		ListeVille = (Villa*) malloc(nb_villes * sizeof(Villa));
    		for (int i = 0; i < nb_villes; i++) {
    			fscanf(infos, "%d %d", &ListeVille[i].position.abscisse,
    					&ListeVille[i].position.ordonnee); //récupère coordonnées des villes
    			printf("Les coordonnées de la ville sont %d %d \n",
    					ListeVille[i].position.abscisse,
    					ListeVille[i].position.ordonnee);
    		}
     
    		fscanf(infos, "%d", &nb_lignes); // affiche le nombre de lignes de train
    		printf("Il y'a %d lignes \n", nb_lignes);
     
    		ListeLigne = (Ligne*) malloc(nb_lignes * sizeof(Ligne));
    		for (int i = 0; i < nb_lignes; i++) {
     
    			fscanf(infos, "%d", &ListeLigne[i].nb_villes_ligne); //récupère nombres de villes sur la ligne
    			printf("Il y'a %d villes sur la ligne %d\n",
    					ListeLigne[i].nb_villes_ligne, i);
     
    			ListeLigne[i].TableauVilleSurLigne = (int*) malloc(
    					(ListeLigne[i].nb_villes_ligne) * sizeof(int)); // On alloue le nécessaire
    			for (int k = 0; k < ListeLigne[i].nb_villes_ligne; k++) {
    				fscanf(infos, "%d", &ListeLigne[i].TableauVilleSurLigne[k]); //récupère identifiants des villes sur la ligne
    				printf("Il y'a la ville n° %d\n", ListeLigne[i].TableauVilleSurLigne[k]);
    			}
     
    			fscanf(infos, "%d", &ListeLigne[i].nb_passage_sur_ligne); //récupère le nombre de passage sur cette ligne
    			printf("Il y'a %d passages journaliers sur cette ligne\n",
    					ListeLigne[i].nb_passage_sur_ligne);
     
    			for (int l = 0; l < ListeLigne[i].nb_passage_sur_ligne; l++) {
    				printf("Voici le passage n° %d \n", l);
     
    				ListeLigne[i].ListeHoraire = (Horaire**) malloc( sizeof(Horaire*) * ListeLigne[i].nb_passage_sur_ligne);
    				for (int compt = 0; compt < ListeLigne[i].nb_villes_ligne; compt++)
    					ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(Horaire));
     
    				for (int j = 0; j < ListeLigne[i].nb_villes_ligne; j++) {
    					fscanf(infos, "%dh%d",
    							&ListeLigne[i].ListeHoraire[j][l].heures,
    							&ListeLigne[i].ListeHoraire[j][l].minutes); //récupère les horaires journalières
    					printf("%d heures et %d minutes\n",
    							ListeLigne[i].ListeHoraire[j][l].heures,
    							ListeLigne[i].ListeHoraire[j][l].minutes);
    				}
    			}
     
    		}
    	}
     
    }
     
     
    int main() {
    	LectureDonnees();
    	printf(
    			"--------------------------------------------------------------------------\n ---------------------- \n ------------------------\n");
    	for (int i = 0; i < nb_villes; i++) {
    						printf("Les coordonnées de la ville sont %d %d \n",
    						ListeVille[i].position.abscisse,
    						ListeVille[i].position.ordonnee);
    			}
     
    	for (int i = 0; i < nb_lignes; i++) {
    		printf("Il y'a %d villes sur la ligne %d\n",
    				ListeLigne[i].nb_villes_ligne, i);
     
    		for (int k = 0; k < ListeLigne[i].nb_villes_ligne; k++) {
    			printf("Il y'a la ville n° %d\n", ListeLigne[i].TableauVilleSurLigne[k]);
    		}
     
    		printf("Il y'a %d passages journaliers sur cette ligne\n",
    				ListeLigne[i].nb_passage_sur_ligne);
     
    		for (int l = 0; l < ListeLigne[i].nb_passage_sur_ligne; l++) {
    			printf("Voici le passage n° %d \n", l);
     
    			for (int j = 0; j < ListeLigne[i].nb_villes_ligne; j++) {
    				printf("%d heures et %d minutes\n",
    						ListeLigne[i].ListeHoraire[j][l].heures,
    						ListeLigne[i].ListeHoraire[j][l].minutes);
    			}
    		}
     
    	}
    	return 0;
    }
    Et le résultat :
    Les coordonnées de la ville sont 383 886
    Les coordonnées de la ville sont 777 915
    Les coordonnées de la ville sont 793 335
    Les coordonnées de la ville sont 386 492
    Les coordonnées de la ville sont 649 763
    Les coordonnées de la ville sont 926 540
    Les coordonnées de la ville sont 426 172
    Les coordonnées de la ville sont 736 874
    Les coordonnées de la ville sont 125 698
    Les coordonnées de la ville sont 187 265
    Il y'a 3 villes sur la ligne 0
    Il y'a la ville n° 1
    Il y'a la ville n° 0 -------------------------------- ça marche <3
    Il y'a la ville n° 9
    Il y'a 2 passages journaliers sur cette ligne
    Voici le passage n° 0
    0 heures et 0 minutes
    0 heures et 0 minutes -------------- Horaires toujours incorrectes RIP x'(
    0 heures et 0 minutes
    Voici le passage n° 1
    3 heures et 30 minutes
    7 heures et 27 minutes
    10 heures et 2 minutes
    Il y'a 3 villes sur la ligne 1
    Il y'a la ville n° 3
    Il y'a la ville n° 8
    Il y'a la ville n° 6
    Il y'a 3 passages journaliers sur cette ligne
    Voici le passage n° 0
    0 heures et 0 minutes
    0 heures et 0 minutes
    0 heures et 0 minutes
    Voici le passage n° 1
    0 heures et 0 minutes
    0 heures et 0 minutes
    0 heures et 0 minutes
    Voici le passage n° 2
    12 heures et 50 minutes
    14 heures et 30 minutes
    18 heures et 27 minutes

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oh oh, je pense avoir trouver ma boulette, le malloc qui initialise à 0, dans la boucle ^^ Je teste ça de suite, pour pallier au problème.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    J'ai résolu mon problème, cela venait du malloc dans la boucle qui réinitialiser à chaque fois les valeurs, j'ai donc rajouté une condition pour cela, voici la partie du code corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(l==0){
    				ListeLigne[i].ListeHoraire = (Horaire**) malloc( sizeof(Horaire*) * ListeLigne[i].nb_passage_sur_ligne);
    				for (int compt = 0; compt < ListeLigne[i].nb_villes_ligne; compt++)
    					ListeLigne[i].ListeHoraire[compt] = (Horaire*) malloc(sizeof(Horaire));
    				}
    Merci à @nnovic , @Matt_Houston ainsi que @Ternel pour m'avoir aider <3

  11. #11
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ce code n'est pas « corrigé ». Applique-lui les conseils suivants et il le sera :

    Citation Envoyé par nnovic Voir le message
    Faire des 'malloc' c'est bien, mais faire les 'free' qui vont avec, c'est mieux!
    Citation Envoyé par Matt_Houston Voir le message
    Vérifie le bon déroulement des opérations.

    [...]

    Ne caste pas le pointeur retourné par malloc.

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Ce code n'est pas « corrigé ». Applique-lui les conseils suivants et il le sera :
    J'ai pas oublié, je le ferai juste plus tard

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème récupération de données en liaison série
    Par prison_break dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/06/2007, 08h51
  2. [VB6] Problème récupération de données
    Par valie dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 29/08/2006, 12h36
  3. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 07h54
  4. [MySQL] Problème récupération de données avec un SELECT DISTINCT
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2005, 14h48
  5. [Débutant] Problème récupération de données
    Par flogreg dans le forum Servlets/JSP
    Réponses: 26
    Dernier message: 20/08/2004, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo