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 creation graphe avec un fichier txt


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 36
    Par défaut problème creation graphe avec un fichier txt
    Bonjour,
    J'aimerais créer un graphe avec des listes chaînées.
    Pour cela j'ai fait un txt avec toutes les informations pour le chaîner.
    Il y a 57 sommet dans mon graphe.
    Il y a un for de 0 à 57 qui permet de chaîner ses successeurs à chacun des 57 sommets.
    Mon problème c'est qu'au bout de 33 itérations, il ne se passe plus rien...
    Les 33 premières se déroulent sans souci, j'ai vérifié par des printf si toutes les informations avaient bien été stockées.
    D'après mes tests, à la 33ème fois, il ne se passe plus rien après :
    fscanf(fichier_graphe, "%d", &nb_succ);
    qui permet de stocker le nombre de successeurs du sommet en cours de traitement.
    Ma question c'est : y a-t-il une taille maximale de fichier ? (en caractères ?)
    Car je ne vois aucune raison pour qu'il ne se passe plus rien, mais je n'y connais pas grand chose non plus. Quand je dis ça, en fait il se passe que le curseur de la console clignote et c'est tout.
    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Il y a une erreur dans ton code (ou/et dans ton fichier), mais comme tu ne le montres pas ...
    Ma question c'est : y a-t-il une taille maximale de fichier ? (en caractères ?)
    Certainement, mais la valeur depend de ton système. De toute façon, tu dois être (très) loin du compte.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 36
    Par défaut
    Rebonjour,
    en fait quelqu'un a testé mon programme, et chez lui ça marche jusqu'au bout ... étrange..
    Je programme avec code blocks 8.02
    Auriez-vous une idée du pourquoi du comment ?
    Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par ALeX850 Voir le message
    Ma question c'est : y a-t-il une taille maximale de fichier ? (en caractères ?) Car je ne vois aucune raison pour qu'il ne se passe plus rien, mais je n'y connais pas grand chose non plus. Quand je dis ça, en fait il se passe que le curseur de la console clignote et c'est tout. Merci pour votre aide
    Pour compléter ce que dit Diogène, il y a souvent un maximum de 2 Go par fichier, quoi que cette limite est en train d'être levée sur les systèmes de fichiers récents.

    Citation Envoyé par ALeX850 Voir le message
    Rebonjour, en fait quelqu'un a testé mon programme, et chez lui ça marche jusqu'au bout ... étrange.. Je programme avec code blocks 8.02 Auriez-vous une idée du pourquoi du comment ? Merci
    C'est un bug intermittent. Il peut être dû à n'importe quoi mais, comme ça, je parierais sur un dépassement de tampon qui doit aller écraser les variables d'à côté, lesquelles sont probablement les indices de ta boucle.

    Poste ton code ici (avec les balises [ CODE ]), et on tâchera de t'aider.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 36
    Par défaut
    Voilà donc cette fonction permet de construire le graphe. Elle n'est pas commentée mais je pense qu'elle est facile à comprendre : on ouvre le fichier, il lit l'ordre du graphe, puis on fait autant d'itérations que l'ordre, il lit le nombre de successeurs du sommet i, puis on chaîne les successeurs...
    (sinon j'aimerais savoir, quand je tronque mes double, il m'affiche quelque chose du genre : XX.XX0000, comment enlever ces 0 ?)

    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
     
    T_sommet **Construction_Graphe(T_sommet **Graphe, int *ordre){
        FILE *fichier_graphe;
        T_sommet *temp = NULL;
        double vitesse_temp;
        int nb_succ = 0;
        int i, j;
     
        fichier_graphe = fopen(".\\graphe.txt", "r");
        if (fichier_graphe == NULL) printf("Probleme d'ouverture fichier");
        else{
            fscanf(fichier_graphe, "%d", ordre);
     
            Graphe = (T_sommet**)malloc(sizeof(T_sommet*));
     
            for(i=0 ; i<(*ordre) ; i++){
                Graphe[i] = (T_sommet*)malloc(sizeof(T_sommet));
                Graphe[i] = NULL;
     
                fscanf(fichier_graphe, "%d", &nb_succ);
     
                if(nb_succ != 0){
                    for(j=0 ; j<nb_succ ; j++){
                        temp = (T_sommet*)malloc(sizeof(T_sommet));
                        fscanf(fichier_graphe, "%d %d %d", &(temp->id), &(temp->distance), &(temp->vitessemax));
                        vitesse_temp = Conversion_kmh_ms(temp->vitessemax);
                        temp->temps = Tronquer_Centieme((temp->distance)/vitesse_temp);
                        temp->vitesse = temp->vitessemax;
                        temp->densitemax = ((temp->distance)/(((temp->vitessemax)/10)+2));
                        temp->densite = 0;
                        Graphe[i] = Ajouter_Sommet(Graphe[i], temp);
                    }
                }
            }
            fclose(fichier_graphe);
            return Graphe;
        }
    }
    Merci

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Bonsoir,

    Citation Envoyé par ALeX850 Voir le message
    Voilà donc cette fonction permet de construire le graphe. Elle n'est pas commentée mais je pense qu'elle est facile à comprendre : on ouvre le fichier, il lit l'ordre du graphe, puis on fait autant d'itérations que l'ordre, il lit le nombre de successeurs du sommet i, puis on chaîne les successeurs...
    Il nous faudrait le code des autres fonctions (celles qui sont appelées dans celle-ci), et surtout la définition de T_sommet mais, à vue de nez, il y a déjà pas mal d'incohérences dans ton programme :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T_sommet **Construction_Graphe(T_sommet **Graphe, int *ordre)
    {
         …
     
            Graphe = (T_sommet**)malloc(sizeof(T_sommet*));

    D'une part, tu demandes à la fonction appelante de te passer un pointeur sur ce que je pense être un tableau de sommets, mais tu écrases le contenu de ce pointeur à la première utilisation par un malloc(). À quoi cela te sert-il de passer un argument ?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i=0 ; i<(*ordre) ; i++){
                Graphe[i] = (T_sommet*)malloc(sizeof(T_sommet));
                Graphe[i] = NULL;

    D'un pointeur sur un tableau, tu fais un tableau de pointeurs. Soit. Mais, en l'occurrence, tu n'as alloué de la place que pour un seul pointeur (dans le paragraphe au dessus). une boucle de 0 à « ordre » va donc forcément sortir de la mémoire allouée. On a donc déjà le dépassement de tableau que l'on subodorait.

    D'autre part, tu alloues un sommet et tu écrases immédiatement le pointeur retourné avec NULL. Mise à part la fuite de mémoire que cela engendre, pourquoi fais-tu cela ?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(nb_succ != 0){
                    for(j=0 ; j<nb_succ ; j++){

    Puisque ton « if » ne contient rien d'autre que la boucle, il ne sert à rien, ici. La boucle ne tournera pas du tout si « nb_succ » est nul ou négatif.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphe[i] = Ajouter_Sommet(Graphe[i], temp);

    Ceci est probablement faux, également, mais on ne peut l'affirmer sans avoir vu le contenu de Ajouter_Sommet.

Discussions similaires

  1. Problèmes avec les fichiers .txt en Java
    Par aghade dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 23/08/2011, 14h24
  2. Probléme de lecture d'un fichier .txt avec java
    Par samorra dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/09/2009, 00h13
  3. Pb avec le fichiers .txt générés
    Par Emilie MARQUOIS-OGEZ dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2006, 13h43
  4. Problème avec mes fichiers txt
    Par salseropom dans le forum C
    Réponses: 5
    Dernier message: 18/05/2006, 15h07
  5. Réponses: 3
    Dernier message: 28/02/2006, 12h41

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