cs_philpas
Messages postés77Date d'inscriptionlundi 17 octobre 2005StatutMembreDernière intervention 4 septembre 2008
-
13 déc. 2005 à 13:07
cs_neko
Messages postés135Date d'inscriptionjeudi 14 août 2003StatutMembreDernière intervention12 octobre 2006
-
16 déc. 2005 à 10:13
Bonjour, j'ai un problème avec l'utilisation de pointeur. Je ne maitrise pas trop cette notion.
J'ai simplifié pour faire court.
J'ai déclaré
type
PLigne_Trou=^Coordonnee_Trou;
Coordonnee_Trou=record
Article:String;
X,Y:Real; //j'ai beaucoup d'autres variables en plus
end;
Var
Ligne_Trou:PLigne_Trou;
Liste_Trou:Tlist;
jusque là pas de soucis. Mon problème est le suivant. Je veux pouvoir rajouter des éléments supplémentaire à ma liste en utilisant les éléments déjà en mémoire de ma liste. Exemple: Dans ma liste, j'ai 5 enregistrements. Je veux en mettre un 6ème qui est la copie de l'enregistrement 1 sauf pour la valeur X que je modifie. J'avais écris:
Ceci m'ajoute bien un 6ème enregistrement mais cela modifie également l'enregistrement 1. L'enregistrement 1 et 6 sont les mêmes. J'en voulais un avec la valeur X et l'autre avec la Valeur X+10. Hors j'ai tout les deux la valeur X+10. En refléchissant c'est normal puisque je pointe sur le même pointeur Ligne_Trou:=Liste_Trou.Items[1];
J'avais alors essayé d'écrire Ligne_Trou^:=Liste_Trou.Items[1]^
Mais là, l'écriture est incorrect. Y a t-il une écriture simple qui me permettrais de faire cette fonction, c'est à dire de renvoyer le contenu total du pointeur dans Ligne_trou pour pouvoir le modifier et l'enregistrer sans que l'enregistrement d'origine se modifie?
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 13 déc. 2005 à 14:37
salut
quand tu écris Ligne_Trou:=Liste_Trou.Items[1];
tu fais adresse de ligne_trou= addresse de l'élément 1; tu n'as pas
copié le contenu mais seulement l'adresse donc quand tu fais Ligne_Trou^.X:=ValX+10;
tu surchage la avleur initiale
pour copier la totalité de ligne_trou passes par une variable intermédiaire
var temp: Pligne_trou;
temp:=liste_trou.items[1];
ligne_trou^:=temp^;
ensuite tu peux travailler sur ligne_trou sans affecter les valeurs initiailes.
cs_philpas
Messages postés77Date d'inscriptionlundi 17 octobre 2005StatutMembreDernière intervention 4 septembre 2008 13 déc. 2005 à 14:52
Merci de ton aide.
c'est ce que je pensais, mais je voulais être sur, il faut repasser par une variable intermédiaire.
Tlist ne donne que des pointeurs, jamais le contenu des pointeurs.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 13 déc. 2005 à 14:56
oui c'est normal d'ailleurs il ne sais pas à priori si le contenu est
comptaible avec la variable ( c'est vrai qu'il pourrait copier par
défaut le nombre d'octets nécessaires mais il ne le fait pas).
cs_neko
Messages postés135Date d'inscriptionjeudi 14 août 2003StatutMembreDernière intervention12 octobre 20061 16 déc. 2005 à 10:13
En général on utilise plutot un cast dans ces cas là:
Pour ajouter un élément:
i:= List_trou.Add( New(PLigne_Trou) );
PLigne_Trou(List_tour.Items[i])^.X:=ValX;
PLigne_Troue(List_Trou.Items[i])^.Y:=ValY;
Pour modifier un élément:
PLigne_Trou(
liste_trou.items[1])^.X:=ValX;
PLigne_Trou(liste_trou.items[1])^.Y:=ValY;
ou
With PLigne_Trou(liste.items[1])^ DoBegin X: =ValX;
Y:= ValY;
End ;
Pour copier un enregistrement dans un autre:
New(Ligne_Trou);
Ligne_Trou^: =PLigne_Trou(liste_trou.items[1])^;
Liste_Trou.Add(Ligne_Trou);
ou plus bordeliquement ( et donc a eviter si on est pas sûr ):
PLigne_Trou(Liste_Trou.Items[Liste_Trou.Add(New(PLigne_Trou))])^:=PLigne_Trou(List_Trou.Items[i])^;