Partage
  • Partager sur Facebook
  • Partager sur Twitter

Overflow que je n'arrive pas à résoudre

Sujet résolu
    28 mars 2017 à 17:34:11

    Bon voilà voilà, j'essaye de lire, des données organisées dans l'ordre et de les ré-afficher. Seulement petit problème, j'ai un overflow x'( Je pense savoir d'où ça vient, j'ai même localisé les 2 champs de structures différents qui s'écrasent car ils partagent la même adresse en mémoire.

    Voici la ligne 287 faisant le test dans la fonction main :

    printf("\nL'adresse 1 :%d: et sa valeur %d L'adresse 2 :%d: et sa valeur %d\n",
    			&ListeLigne[1].ListeHoraire[1][2].Horaire_en_minutes,ListeLigne[1].ListeHoraire[1][2].Horaire_en_minutes,&ListeLigne[1].ListeHoraire[2][0].heures,ListeLigne[1].ListeHoraire[2][0].heures);

    Voici le résultat : L'adresse 1 : 33724464: et sa valeur 870 L'adresse 2 : 33724464: et sa valeur 870

    Comme vous pouvez le voir, les champs sont différents mais ils partagent la même adresse. Voici mon code ci-dessous, mon problème doit probablement venir de la ligne n°107 et 102, je cite l'endroit car le code est long. Je pense que c'est à cause du fait que je lis les données dans l'ordre et que j'alloue mal les tableaux. Devrais-je utiliser un realloc, je ne suis pas un pro du C je ne sais pas trop.

    Mon programme est assez long, si vous ne comprenez pas trop le code ou que vous voulez que je détaille pour faciliter votre compréhension, n'hésitez pas à me poser la question merci :)

    Ne lisez pas les printf car elles écrivent ce que les scanf récupèrent à l'instant, je vous évite de perdre du temps ^^.

    Pour info il s'agit de récupérer les horaires, lignes, et gares d'un réseau ferroviaire

    Voici les données que mon programme lit :

    10
    383 886 777 915 793 335 386 492 649 763 926 540 426 172 736 874 125 698 187 265
    2
    3
    1 0 9
    2
    14h44 18h41 21h16
    03h30 07h27 10h02
    3
    3 8 6
    3
    20h33 22h13 02h10
    05h02 06h42 10h39
    12h50 14h30 18h27

    Et voici le code source :

    * utils.c
     *
     *  Created on: 21 janv. 2017
     *      Author: totor
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "Dijkstra.h"
    
    int nb_villes; //nombres de villes
    int nb_lignes; //nombre lignes de trains
    //graph_t *Reseau = calloc(1, sizeof(graph_t)); // extirpé de la fonction voidCreerReseau
    graph_t *Reseau;
    
    typedef struct Horaire Horaire;
    struct Horaire {  // structure d'une Horaire
    	int heures;
    	int minutes;
    	int Horaire_en_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;
    };
    Ligne *ListeLigne;
    
    typedef struct Chemin Chemin;
    struct Chemin {  // structure d'un chemin optimal
    	int longueur_chemin;
    	int *path;
    };
    Chemin CheminOpti;
    
    
    void LectureDonnees() {		//Lit les données  dans le fichier
    
    	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);						//Se prépare à lister tous les passages journaliers
    
    				if (l == 0) {	//Condition qui sert à utiliser malloc une seule fois afin de ne pas écraser données précédentes
    					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
    					ListeLigne[i].ListeHoraire[j][l].Horaire_en_minutes =
    							Convertir_Horaire_Minute(	// Et les convertit également en minutes
    									ListeLigne[i].ListeHoraire[j][l].heures,
    									ListeLigne[i].ListeHoraire[j][l].minutes);
    					printf(
    							"%d heures et %d minutes soit %d minutes une fois converti\n",
    							ListeLigne[i].ListeHoraire[j][l].heures,
    							ListeLigne[i].ListeHoraire[j][l].minutes,					//Affiche les horaires journalières
    							ListeLigne[i].ListeHoraire[j][l].Horaire_en_minutes);
    				}
    			}
    
    		}
    	}
    
    }
    
    void Construire_Reseau() {
    	Reseau = calloc(1, sizeof(graph_t));
    	for (int i = 0; i < nb_lignes; i++) {									//balaye toutes les lignes
    		for (int j = 0; j < ListeLigne[i].nb_villes_ligne - 1; j++) { 		//balaye tous les trajets entre villes
    			for (int k = 0; k < ListeLigne[i].nb_passage_sur_ligne; k++) {	//balaye toutes les horaires de passage sur ce trajet entre ville
    				int poids_arete = (ListeLigne[i].ListeHoraire[j + 1][k].Horaire_en_minutes)	- (ListeLigne[i].ListeHoraire[j][k].Horaire_en_minutes); // Calcule le temps de trajet entre 2 villes voisines
    				ajouter_arete(Reseau,										//Le réseau sous forme de graphe ?
    						ListeLigne[i].TableauVilleSurLigne[j],				//ville v
    						ListeLigne->TableauVilleSurLigne[j + 1],			//ville v'
    						poids_arete,										//durée du voyage
    						ListeLigne[i].ListeHoraire[j][k].Horaire_en_minutes); //---- Horaire d'arrivée en gare
    				printf(
    						"Le poids de l'arete est %d minutes\n La ville de départ est %d\n La ville d'arrivée est %d\nDépart à %dh%d\nArrivée à %dh%d\n------------------------------\n",
    						poids_arete, ListeLigne[i].TableauVilleSurLigne[j],
    						ListeLigne->TableauVilleSurLigne[j + 1],
    						ListeLigne[i].ListeHoraire[j][k].heures,			//Affiche dans l'ordre : la durée du trajet,
    						ListeLigne[i].ListeHoraire[j][k].minutes,			//la ville de départ, la ville d'arrivée,
    						ListeLigne[i].ListeHoraire[j + 1][k].heures,		//l'heure de départ et l'heure d'arrivée
    						ListeLigne[i].ListeHoraire[j + 1][k].minutes);
    			}																/*Mais bugue à un moment, il se trompe quand il récupère 1 certaine ville*/
    		}
    
    	}
    }
    
    
    void VerifDonnee(){
    	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);
    				}
    			}
    
    		}
    		printf("------------------\n");
    }
    
    int main() {
    	LectureDonnees();
    	Construire_Reseau();
    	//VerifDonnee();
    	//TestGraphe1();
    	printf("\nL'adresse 1 :%d: et sa valeur %d L'adresse 2 :%d: et sa valeur %d\n",
    			&ListeLigne[1].ListeHoraire[1][2].Horaire_en_minutes,ListeLigne[1].ListeHoraire[1][2].Horaire_en_minutes,&ListeLigne[1].ListeHoraire[2][0].heures,ListeLigne[1].ListeHoraire[2][0].heures);
    	return 0;
    }
    





    -
    Edité par LeCastorBricolor 28 mars 2017 à 17:44:41

    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2017 à 19:13:01

      Bonjour,

      Les tailles d'allocations et le remplissages de ListeLigne[i].ListeHoraire[j][l] ne se correspondent pas.
      Quelle est la plage des 'i', des 'j' et des 'l' ?
      A l'allocation, il y a  nb_lignes 'i'(en 68), il y a  nb_passage_sur_ligne 'j'(en 103), il y a 1 seul 'l'(en 107).
      A l'utilisation,  0<= i < nb_lignes ok mais 0<= j < nb_villes_ligne et 0<= l < nb_passage_ligne.
      Ça ne correspond pas du tout!  

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        28 mars 2017 à 20:51:17

        Dalfab a écrit:

        Bonjour,

        Les tailles d'allocations et le remplissages de ListeLigne[i].ListeHoraire[j][l] ne se correspondent pas.
        Quelle est la plage des 'i', des 'j' et des 'l' ?
        A l'allocation, il y a  nb_lignes 'i'(en 68), il y a  nb_passage_sur_ligne 'j'(en 103), il y a 1 seul 'l'(en 107).
        A l'utilisation,  0<= i < nb_lignes ok mais 0<= j < nb_villes_ligne et 0<= l < nb_passage_ligne.
        Ça ne correspond pas du tout!  


        heu j'ai pas compris, je pense pas que ça vient de là, mais j'y reréfléchirai ^^ Bon je réessaierai demain matin car c'est tard, mais je pense que mon problème vient  de l'ordre de récupération des données car je fais malloc sur *ListeLigne alors que je ne connais pas encore la taille de **ListeHoraire. Ce qui je qui je pense pose problème car **ListeHoraire est compris dans *ListeLigne qui est un pointeur de tableau sur structure (ligne 35 à 43). C'est pour ça que je hais le C xD tous ces pointeurs

        Donc le vrai problème selon moi, ce serai d'arriver à allouer un pointeur vers structures avec un autre pointeur déjà alloué o_O On s'amuse avec le C :D Si quelqu'un a la réponse de suite je suis preneur x') j'ai la flemme de réfléchir ce soir, je ferai ça demain En tout cas merci d'avoir pris le temps de répondre, je poste demain mes résultats ;)

        -
        Edité par LeCastorBricolor 28 mars 2017 à 21:00:26

        • Partager sur Facebook
        • Partager sur Twitter
          29 mars 2017 à 23:43:37

          Dalfab a écrit:

          Bonjour,

          Les tailles d'allocations et le remplissages de ListeLigne[i].ListeHoraire[j][l] ne se correspondent pas.
          Quelle est la plage des 'i', des 'j' et des 'l' ?
          A l'allocation, il y a  nb_lignes 'i'(en 68), il y a  nb_passage_sur_ligne 'j'(en 103), il y a 1 seul 'l'(en 107).
          A l'utilisation,  0<= i < nb_lignes ok mais 0<= j < nb_villes_ligne et 0<= l < nb_passage_ligne.
          Ça ne correspond pas du tout!  


          J'ai rerepensé à ce que tu m'avais dit et tu avais en partie raison, j'ai oublié de multiplié un sizeof par mon nombre de ville lors d'un malloc, ce qui a provoqué un overflow o_O Je suis vraiment aveugle, merci en tout cas ;)

          -
          Edité par LeCastorBricolor 29 mars 2017 à 23:45:14

          • Partager sur Facebook
          • Partager sur Twitter

          Overflow que je n'arrive pas à résoudre

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown