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
* 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
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!
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é On s'amuse avec le C 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
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 Je suis vraiment aveugle, merci en tout cas
- Edité par LeCastorBricolor 29 mars 2017 à 23:45:14
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.
En recherche d'emploi.