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:
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.
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;
Merci d'avance,
Anthony
Partager