Bonjour, je développe un programme qui parcours une liste chaînée comportant plusieurs champs. Certains de ces champs sont des pointeurs vers d'autres listes chaînées.

Mon problème: Il semble qu'un champ (contenant l'adresse d'une liste chaînée) ai la même adresse d'un maillon à l'autre.

Illustration:

Voici la définition de la liste chaînée concernée

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
/* list chainer d'elements pour la lecture des donnees */
typedef struct lc_t_elem_ {
   INT num;                    /* numero d'element */
   INT typel;                  /* type de l'element */
   INT taille;                 /* taille de la connectivite */
   LCTINT *connect;            /* connectivite de l'element */
   LCTREEL *vectori;           /* vecteur d'orientation pour les poutres */
   INT prop;                   /* numero de propriete associer */
   INT stratif;                /* numero de la stratification associer */
   INT repere;                 /* numero de repere de definition de la stratification */
   INT repere_contraintes;     /* repere de contrainte */
   char *n1,*n2;               /* chaine de charactere */
   REEL coef;                  /* coeficiant multiplicatif pour les supers elements */
   struct lc_t_elem_ *suiv;    /* pointeur sur l'element suivant de la liste */
} LCTELEM;

Voici le code qui sert à parcourir la liste chaînée(beaucoup de lignes sont des affichages et ne servent qu'au debbug)

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* remplissage de la table
     des elements :  elements poutre en deuxieme
     ------------------------------------------- */
  m=3;
  if (nb_elpou)
  {
     for (p_lctelem=pb_lctelem;p_lctelem->num>0;p_lctelem=p_lctelem->suiv)
     {
 
         if (p_lctelem->typel==TYEL_P_ )
         {
			printf("\n\nadresse du maillon traité = (%d) \n",p_lctelem);
           pi[k]=p_lctelem->num;
           p1[k]=TYEL_P_;
           p2[k++]=p_lctelem->prop;
           dealloc_lctentier(&pk[l],p_lctelem->connect);
 
			//______________________________________________________________________________
			int inc;
			printf("m = %d\n",m);
			printf("pr[m] (%d)\n",&pr[m]);
			printf("p_lctelem(%d)->vectori (%d)\n",p_lctelem,p_lctelem->vectori);
 
			LCTREEL* tmpp2;
			tmpp2=p_lctelem->vectori;
			printf("vectori :");
			while(tmpp2!=NULL){
			printf("%.1f; ",tmpp2->val);
			tmpp2=tmpp2->suiv;
			}
 
			printf("\n");
			//______________________________________________________________________________
 
 
 
           dealloc_lctreel(&pr[m],p_lctelem->vectori);
           distinct(&pk[l], &c__1, &p_lctelem->taille, &n, &q, &ok); 
           if (ok!=TRUE_)
           {
              dammsg(ERR_CONECTELEM_,ERR_CHOERELEMP_,p_lctelem->num,pk[l+n-1],n,q,routine);
              return(-1);
           }
           l+=p_lctelem->taille;
           m+=9;
           pj[k]=l+1;
         }
     }
  }
 
 
 
 
  /* remplissage de la table
     des elements :  elements ressort en troisième
     ------------------------------------------- */
 
  if (nb_elress)
  {
     for (p_lctelem=pb_lctelem;p_lctelem->num>0;p_lctelem=p_lctelem->suiv)
     {
 
         if (p_lctelem->typel==TYEL_RESS_ )
         {
			printf("\n\nadresse du maillon traité = (%d) \n",p_lctelem);
            pi[k]=p_lctelem->num;
            p1[k]=TYEL_RESS_;
            p2[k]=p_lctelem->prop;
			printf("p2[k] = %d \n",p2[k]);
			printf("p_lctelem->prop = %d \n",p_lctelem->prop);
			k++;
			printf("p_lctelem->connect (%d)\n",p_lctelem->connect);
            dealloc_lctentier(&pk[l],p_lctelem->connect);
			//______________________________________________________________________________
			int inc;
			printf("m = %d\n",m);
			printf("pr[m] (%d)\n",&pr[m]);
 
			for (inc=0;inc<9*(nb_elpou+nb_elress);inc++){
			printf("pr[%d] = %f\t",inc,pr[inc]);
			if ((inc+1)%9==0)printf("\n");
			}
 
			printf("p_lctelem(%d)->vectori (%d)\n",p_lctelem,p_lctelem->vectori);
 
			LCTREEL* tmpp2;
			tmpp2=p_lctelem->vectori;
			printf("vectori :");
			while(tmpp2!=NULL){
			printf("%.1f; ",tmpp2->val);
			tmpp2=tmpp2->suiv;
			}
 
			printf("\n");
			//______________________________________________________________________________
           // dealloc_lctreel(&pr[m],p_lctelem->vectori);
           // distinct(&pk[l], &c__1, &p_lctelem->taille, &n, &q, &ok); 
           // if (ok!=TRUE_)
           // {
              // dammsg(ERR_CONECTELEM_,ERR_CHOERELEMP_,p_lctelem->num,pk[l+n-1],n,q,routine);
              // return(-1);
           // }
            l+=p_lctelem->taille;
            m+=9;
            pj[k]=l+1;
         }
     }
  }

Voici les affichages récupérés après avoir fait tourné le programme:

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
 
adresse du maillon traité = (529106080) 
m = 3
pr[m] (529086696)
p_lctelem(529106080)->vectori (529106240)
vectori :1.0; 0.0; 0.0; 
 
 
adresse du maillon traité = (529106336) 
m = 12
pr[m] (529086768)
p_lctelem(529106336)->vectori (529106496)
vectori :1.0; 0.0; 0.0; 
 
 
adresse du maillon traité = (529106592) 
p2[k] = 1 
p_lctelem->prop = 1 
p_lctelem->connect (529106688)
m = 21
pr[m] (529086840)
pr[0] = 0.000000	pr[1] = 0.000000	pr[2] = 0.000000	pr[3] = 1.000000	pr[4] = 0.000000	pr[5] = 0.000000	pr[6] = 0.000000	pr[7] = 0.000000	pr[8] = 0.000000	
pr[9] = 0.000000	pr[10] = 0.000000	pr[11] = 0.000000	pr[12] = 1.000000	pr[13] = 0.000000	pr[14] = 0.000000	pr[15] = 0.000000	pr[16] = 0.000000	pr[17] = 0.000000	
pr[18] = 0.000000	pr[19] = 0.000000	pr[20] = 0.000000	pr[21] = 0.000000	pr[22] = 0.000000	pr[23] = 0.000000	pr[24] = 0.000000	pr[25] = 0.000000	pr[26] = 0.000000	
pr[27] = 0.000000	pr[28] = 0.000000	pr[29] = 0.000000	pr[30] = 0.000000	pr[31] = 0.000000	pr[32] = 0.000000	pr[33] = 0.000000	pr[34] = 0.000000	pr[35] = 0.000000	
p_lctelem(529106592)->vectori (529106496)
vectori :0.0; 0.0; 0.0; 
 
 
adresse du maillon traité = (529106752) 
p2[k] = 1 
p_lctelem->prop = 1 
p_lctelem->connect (529106848)
m = 30
pr[m] (529086912)
pr[0] = 0.000000	pr[1] = 0.000000	pr[2] = 0.000000	pr[3] = 1.000000	pr[4] = 0.000000	pr[5] = 0.000000	pr[6] = 0.000000	pr[7] = 0.000000	pr[8] = 0.000000	
pr[9] = 0.000000	pr[10] = 0.000000	pr[11] = 0.000000	pr[12] = 1.000000	pr[13] = 0.000000	pr[14] = 0.000000	pr[15] = 0.000000	pr[16] = 0.000000	pr[17] = 0.000000	
pr[18] = 0.000000	pr[19] = 0.000000	pr[20] = 0.000000	pr[21] = 0.000000	pr[22] = 0.000000	pr[23] = 0.000000	pr[24] = 0.000000	pr[25] = 0.000000	pr[26] = 0.000000	
pr[27] = 0.000000	pr[28] = 0.000000	pr[29] = 0.000000	pr[30] = 0.000000	pr[31] = 0.000000	pr[32] = 0.000000	pr[33] = 0.000000	pr[34] = 0.000000	pr[35] = 0.000000	
p_lctelem(529106752)->vectori (529106496)
vectori :0.0; 0.0; 0.0;
Remarque: L'adresse du maillon traité évolue correctement tandis que l'adresse du champs "vectori" des maillon ne change qu'une fois et ensuite reste la même.

Merci d'avance,

Anthony