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,