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 :

Ecrasement de valeurs : Passage de tableau dynamique contenant des structures


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Ecrasement de valeurs : Passage de tableau dynamique contenant des structures
    Bonjour à tous,

    J'ai un problème d'écrasement de valeurs. En fait, il s'agit de lire un maillage dans un fichier texte. La taille (nombre de noeud) du maillage et les coordonnées des noeuds du maillage sont en effet contenus dans un fichier texte... Le nombre de noeud n'étant pas connu à la compilation, il faut donc utiliser un tableau dynamique.

    Il est donc logique de créer une procédure qui me renvoie la taille et les coordonnées de chaque noeud :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void READ_NODES(int *Nb_nodes, NODES *Node)
    Dans le programme principal, on pourra donc automatiquement lire les coordonnées des noeuds et le nombre des noeuds de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NODES *Node;
    int Nb_nodes;
    READ_NODES(&Nb_nodes, Node);

    Pour faciliter la compréhension du problème d'écrasement de valeurs, j'ai simplifié le programme en remplaçant toute la lecture dans un fichier texte par des affectations de valeurs. L'intéret de l'allocation dynamique est perdu (Nx=3 et Ny=3 à la compilation) dans le but de fournir une illustration simple du problème.
    Voici donc un programme simple (appelé 'main.c') que vous pouvez compilez par la commande 'gcc main.c -o main' :
    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
     
    #include<stdio.h>
    #include<stdlib.h>
     
    typedef struct {  double X; 
                      double Y; } COORDINATES;
    typedef struct {  int Nb_neigh;
                      COORDINATES Coord; } NODES;
     
    void READ_NODES(int *Nb_nodes, NODES *Node)
    {
       int Nx=3, Ny=3;
       void READ_NB_NODES(int *Nb_nodes)
     
       {  *Nb_nodes = Nx*Ny;
     
       }
     
     
       READ_NB_NODES(Nb_nodes);
       Node = (NODES *) calloc(*Nb_nodes, sizeof(NODES));
       int i, j, No_node=0;
       for(i=0; i<Nx; i++)
          for(j=0; j<Nx; j++)
          {  Node[No_node].Coord.X = (double)i/(Nx-1);
             Node[No_node].Coord.Y = (double)j/(Ny-1);
             No_node++;
          }
       //On a finit de lire les coordonnées des différents noeuds et on affiche ces coordonnées.
       printf("READ_NODES:\n");
       for(No_node=0; No_node<*Nb_nodes; No_node++)
          printf("No_node:%d    X:%.4g Y:%.4g\n", No_node, Node[No_node].Coord.X, Node[No_node].Coord.Y);
       //Ici, l'affichage des données est correct!
    }
     
     
    int main()
    {  int Nb_nodes, No_node;
       NODES *Node;
       READ_NODES(&Nb_nodes, Node);
       //On réaffiche les coordonnées des différents noeuds
       printf("MAIN:\n");
       for(No_node=0; No_node<Nb_nodes; No_node++)
          printf("No_node:%d    X:%.4g Y:%.4g\n", No_node, Node[No_node].Coord.X, Node[No_node].Coord.Y);
       //Ces coordonnées sont différentes...
    }

    Ce programme s'exécute sans problème sauf que les coordonées des différents noeuds sont :
    - à la fin de la procédure READ_NODES :
    No_node:0 X:0 Y:0
    No_node:1 X:0 Y:0.5
    No_node:2 X:0 Y:1
    No_node:3 X:0.5 Y:0
    No_node:4 X:0.5 Y:0.5
    No_node:5 X:0.5 Y:1
    No_node:6 X:1 Y:0
    No_node:7 X:1 Y:0.5
    No_node:8 X:1 Y:1

    - au retour dans le programme principal :
    No_node:0 X:-7.292e-304 Y:3.665e+62
    No_node:1 X:1.284e-309 Y:4.504e-312
    No_node:2 X:3.725e-310 Y:-2.481e-265
    No_node:3 X:2.443e-232 Y:3.173e-296
    No_node:4 X:-2.313e-212 Y:9.119e-300
    No_node:5 X:1.097e-300 Y:2.826e-134
    No_node:6 X:-1.466e+40 Y:-6.944e-252
    No_node:7 X:8.435e-312 Y:3.265e+25
    No_node:8 X:5.068e+256 Y:-701.5

    Les coordonnées des noeuds semblent être écrasées à la sortie de la procédure READ_NODES. à moins que j'accède à l'addresse plutôt qu'au contenu....

    Si vous avez une idée du problème, vous me seriez d'une grande aide.
    Merci d'avance,

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    1) il faut poster quelque chose qui compile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void READ_NODES(int *Nb_nodes, NODES *Node)
    {
       int Nx=3, Ny=3;
       void READ_NB_NODES(int *Nb_nodes)
     
       {  *Nb_nodes = Nx*Ny;
     
       }
    une fonction dans une fonction, pour moi (et C++Builder) cela ne compile pas.

    2) Il faut mettre des accolades pour les boucles for même s'il n'y a qu'une ligne. Ceci pour des raisons de lisibilité et d'évolutivité.

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Est-ce que la valeur max ne devrait pas être Ny pour cette boucle ?
    Comme Nx vaut 3 comme Ny, je ne pense pas que cela vienne de là, mais bon...

  4. #4
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Un ptit cadeau:

    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
     
    #include<stdio.h>
    #include<stdlib.h>
     
    typedef struct {  double X; 
                      double Y; } COORDINATES;
    typedef struct {  int Nb_neigh;
    				  COORDINATES Coord; } NODES;
     
       void READ_NB_NODES(int *Nb_nodes)
       {
    	int Nx=3, Ny=3;
    	 *Nb_nodes = Nx*Ny;
     
       }
     
    void READ_NODES(int *Nb_nodes, NODES **pNode)
    {
       NODES *Node;
       int i, j, No_node=0;
    	int Nx=3, Ny=3;
    	 *Nb_nodes = Nx*Ny;
     
     
       //READ_NB_NODES(Nb_nodes);
       Node = (NODES *) calloc(*Nb_nodes, sizeof(NODES));
       *pNode = (NODES *)Node;
       for(i=0; i<Nx; i++)
    	  for(j=0; j<Nx; j++)
    	  {
    		 Node[No_node].Coord.X = (double)i/(Nx-1);
    		 Node[No_node].Coord.Y = (double)j/(Ny-1);
    		 No_node++;
    	  }
       //On a finit de lire les coordonnées des différents noeuds et on affiche ces coordonnées.
       printf("READ_NODES:\n");
       for(No_node=0; No_node<*Nb_nodes; No_node++)
    	  printf("No_node:%d    X:%.4g Y:%.4g\n", No_node, Node[No_node].Coord.X, Node[No_node].Coord.Y);
       //Ici, l'affichage des données est correct!
    }
     
     
    int main()
    {  int Nb_nodes, No_node;
       NODES *Node;
       READ_NODES(&Nb_nodes, &Node);
       //On réaffiche les coordonnées des différents noeuds
       printf("MAIN:\n");
       for(No_node=0; No_node<Nb_nodes; No_node++)
    	  printf("No_node:%d    X:%.4g Y:%.4g\n", No_node, Node[No_node].Coord.X, Node[No_node].Coord.Y);
       //Ces coordonnées sont les mêmes maintenant...
       // coopyright Bayard
     
       return 0;
    }

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Alors là, je remercie beaucoup Bayard pour son petit cadeau qui fonctionne parfaitement. Je ne croyais plus à ce bonhomme au chapeau rouge, en tout cas, son traineau est d'une rapidité époustouflante!!!
    Je m'excuse pour la fonction imbriquée qui ne se compile pas sous C++ Builder (J'utilise en fait gcc sous fedora linux) et que j'aurais pu supprimer pour ce programme simple... Bien vu pour la boucle, Ny devrait effectivement être remplacé par Nx mais c'était une petite modif rapide pour présenter un exemple simple (maillage structuré cartésien). Dans mon code, il s'agit de maillage non-structuré donc pas de Nx et Ny!!! Sinon, je vais tenir compte du conseil pour mettre les accolades sur les boucles for même si elles ne contiennent qu'une ligne.

    Si j'ai bien compris, il s'agissait donc d'un problème d'adresse.Il fallait apparemment envoyer l'adresse du pointeur (ou tableau) Node dans la procédure READ_NODES afin de pouvoir modifier le contenu de la structure COORDINATES. Comme
    le passage de cette structure se fait maintenant par addresse, les valeurs de la structure COORDINATES ne sont plus écrasées au retour de la procédure...


    Merci pour tout et bonne fin de semaine,
    Salutations,
    Eric

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

Discussions similaires

  1. passage de tableau dynamique
    Par julien.63 dans le forum C
    Réponses: 14
    Dernier message: 08/06/2007, 22h36
  2. Accéder à une valeur d'un tableau dynamiquement
    Par Le_PounK dans le forum Struts 1
    Réponses: 2
    Dernier message: 23/03/2007, 13h35
  3. Réponses: 4
    Dernier message: 20/03/2007, 19h28
  4. Réponses: 6
    Dernier message: 26/12/2006, 17h01
  5. Passage de tableau dynamique en paramètre
    Par Didier L dans le forum Langage
    Réponses: 3
    Dernier message: 08/09/2005, 23h04

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