Les pointeurs

Résolu
cs_philpas
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008
- 13 déc. 2005 à 13:07
cs_neko
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 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;

pour mettre un élément dans la liste je fais

New(Ligne_Trou);
Ligne_Trou^.Article:=Fichier;
Ligne_Trou^.X:=ValX;
Ligne_Trou^.Y:=valY;
Liste_Trou.Add(Ligne_Trou);

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:

New(Ligne_Trou);
Ligne_Trou:=Liste_Trou.Items[1];

Ligne_Trou^.X:=ValX+10;
Liste_Trou.Add(Ligne_Trou);

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?

merci.

4 réponses

jlen100
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
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.

@+

jlen
3
cs_philpas
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Derniè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.
0
jlen100
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
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).
0
cs_neko
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006
1
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])^ Do Begin
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])^;

bouh
0