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 :

Probleme au passage d'une variable


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Par défaut Probleme au passage d'une variable
    Bonjour,

    Comme le titre l'indique, un probleme de variable opere au moment du passage d'un double pointeur sur structure.

    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
     
    void            moving_ants(char **tab, t_histo *ways, t_ant **anthill)
    {
      int           nb_total;
      int           current_ant;
      int           dispo_way;
      t_ant         *ptr;
     
      *anthill = NULL;
      nb_total = record_nb_fourmi(tab);
      current_ant = 0;
      dispo_way = 0;
      while (current_ant <= nb_total)
        {
          if (!create_ants(anthill, nb_total, current_ant, ways, &dispo_way))
            {
              ptr = *anthill;
              printf("(1)Anthill = %x | *Anthill = %x | Anthill->next = %x\n", anthill, *anthill, ptr->next);
              aff_ants(anthill); /* Je fais appel ici a la fonction */
            }
          current_ant++;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void            aff_ants(t_ant **anthill)
    {
      char          *room;
      char          *nbr_of_ant;
      t_ant         *ant;
     
      ant = *anthill;
     
      printf("(2)Anthill = %x | *Anthill = %x | Ant->next = %x\n", anthill, *anthill, ant->next);
      printf("(3)Ant->next = %x | Ant->nbr = %d | Ant->Way = %s\n", ant->next, ant->nbr_ant, ant->my_way);
      exit(0);
    }
    Ce code continue mais je l'ai coupe car le probleme arrive avant.

    Voici ce que j'obtiens sur la sortie standard :
    (0)Anthill = bfbfe74c | *Anthill = bfbfe6d0 | Ant->next = 0
    (1)Anthill = bfbfe74c | *Anthill = bfbfe6d0 | Anthill->next = 0
    (2)Anthill = bfbfe74c | *Anthill = bfbfe6d0 | Ant->next = bfbfe6f8
    (3)Ant->next = bfbfe6d0 | Ant->nbr = 134522492 | Ant->Way = Ðæ¿¿Pè

    - Le (0) indique que les changements ont bien ete fait a la fin de la fonction create_ants().
    - Le (1) indique que tout est correct, ca reste inchange.
    - Et la, a partir du (2), c'est la debandade...

    Le truc, c'est qu'aucune ecriture dans la memoire n'est faite, donc ce n'est sans doute meme pas lie a un mauvais malloc qui n'aurait pas assez liberer d'espace...
    Bref, je n'ai aucune idee de quoi faire et c'est ce qui me pousse a vous demander votre aide.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Dans tout ce que vous dites, il n'y a pas assez d'information pour nous laisser suggerer des idées.
    Premièrement, le bug peut venir de la fonction 'create_ants()', mais aussi par ce décalage ->
    ( Même si je ne vois pas l'effet )

    Je vous conseille donc, soit un débuggage à la main ( gdb ou autre ) pas à pas, soit de nous donner beaucoup plus d'informations.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Par défaut
    Bonjour,

    Voici la fonction create_ants :

    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
     
    int             create_ants(t_ant **anthill, int nb_total, int current_ant,
                                t_histo *ways, int *dispo_way)
    {
      char          *find_way;
      t_ant         ant;
      t_ant         *ptr;
     
      if (!(find_way = take_way(anthill, ways, nb_total - current_ant, dispo_way)))
        return (0);
      ant.next = 0x0;
      ant.nbr_ant = current_ant;
      ant.my_way = find_way;
      if (!*anthill)
        *anthill = &ant;
      else
        {
          ptr = *anthill;
          while (ptr->next)
            ptr = ptr->next;
          ptr->next = &ant;
        }
      printf("(0)Anthill = %x | *Anthill = %x | Ant->next = %x\n", anthill, *anthill, ant.next);
      return (1);
    Dans le principe, je veux faire une liste chainee de "fourmi" qui vont contenir chacun un numero ainsi qu'un chemin qui lui est attribue dans take_way().

    Sachant que c'est un project scolaire, j'aimerai eviter de diffuser l'algorithme que contient la fonction take_way(). Mais en gros, parmi plusieurs chemins sous forme de char*, on attribue aux fourmis le chemin le plus court.
    Mais mon probleme est surtout concentre aux deux bouts de code donne plutot ou la valeur change, pour moi, de facon arbitraire. J'ai regarde avec gdb, mais il semble reagit de facon assez etrange. C'est-a-dire qu'il fait des aller-retours inhabituels lors des boucles.
    Je ne sais pas trop ce que je peux donner d'autres comme information. Demandez, et j'essayerai de vous le fournir.

    Merci en tout cas pour cette premiere reponse.

  4. #4
    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
    Sans entrer dans le détail du code, une chose attire tout de suite mon attention :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int  create_ants(t_ant **anthill, int nb_total, int current_ant,
                                t_histo *ways, int *dispo_way)
    {
    ...
      t_ant         ant;
    ...
      if (!*anthill)
        *anthill = &ant;
      else
        {
    ...
          ptr->next = &ant;
        }
    ...
    Tu renvoies l'adresse d'une variable locale, variable qui est détruite en sortie de fonction.
    L'adresse d'une variable locale ne doit jamais être utilisée en dehors de la fonction.

    ant devrait être alloué dynamiquement.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Par défaut
    C'est vrai que c'est la premiere fois que je faisais de cette facon aussi ! Je sais que la variable est detruite, mais etrangement, je n'y ai pas du tout pense cette fois. Merci beaucoup pour ton aide ! Je vais pouvoir avancer dans mon projet

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

Discussions similaires

  1. [Débutant] Probleme d'incrémentation d'une variable
    Par sakuragikan dans le forum ASP
    Réponses: 2
    Dernier message: 25/08/2005, 13h11
  2. [C#] Passage d'une variable pour un controluser
    Par julio84 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 07/04/2005, 13h50
  3. probleme de passage dans une boucle
    Par EssaiEncore dans le forum ASP
    Réponses: 16
    Dernier message: 15/02/2005, 17h39
  4. [Debutant] Probleme d'acces a une variable
    Par Bugmaster dans le forum Langage
    Réponses: 16
    Dernier message: 02/09/2004, 15h57
  5. Réponses: 13
    Dernier message: 14/06/2003, 22h15

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