2010-04-05 3 views
1

Dans mon application, j'ai créé la liste de types TList dans laquelle je stocke les pointeurs sur 1 chaîne et 2 valeurs flottantes (réelles) pour 3 articles. Alors, je veux obtenir les valeurs hors de la liste, mais je ne pouvais le faire pour la chaîneComment obtenir une valeur flottante pointée par le pointeur?

sStr := string(lList.items[i]); 

Mais je ne pouvais pas obtenir les valeurs flottantes comme a := real(lList...) se traduira par

aList.Add(@sName); //string 
aList.Add(@x1); //float 
aList.Add(@x2); //float 

une erreur de typage invalide.

Alors, que dois-je faire pour obtenir les valeurs flottantes?
Bien sûr, j'ai une question si la conversion de chaîne me donnera la valeur de chaîne. Je ne suis pas bon en matière de pointeur, donc je ne sais pas comment le faire.

+0

Il manque certaines données, mais ce type d'affectation peut entraîner une violation d'accès. Lorsque vous lancez une chaîne sur un pointeur, cela n'augmente pas le nombre de références. Ainsi, lorsque sName sort de la portée, votre pointeur peut devenir invalide. Il en va de même pour vos valeurs flottantes. Lorsque les variables X1 et X2 sont hors de portée, les pointeurs ne sont plus valides. En ce qui concerne le transtypage invalide, vous pouvez faire un typecast comme ceci, vous avez probablement juste oublié de déréférencer le pointeur. Double (lListe [I] ^) –

Répondre

5

Je vous recommande de créer un enregistrement:

TMyRecord = record 
    sName: String 
    x1: Double; 
    x2: Double; 
end; 

puis créer une liste générique de ce type:

var 
    MyRecordList: TList<MyRecord>; 

et à partir de là, vous devriez être en mesure d'accéder facilement à vos données dans la liste.

Essayer de stocker des données dans un TList avec des types de données spécifiques dans des positions spécifiques comme celles-là est bien plus compliqué que nécessaire.

+1

+1. J'étais sur le point de dire la même chose, mais Nick m'a battu. Vous pouvez trouver le TList générique dans l'unité 'Generics.Collections'. Mais il a quelques étranges bizarreries de compilateur dans Delphi 2009 et pourrait ne pas toujours fonctionner correctement. Si vous avez des problèmes, je vous recommande de passer à Delphi 2010, qui est beaucoup plus stable quand il s'agit de génériques. –

2

Je suis d'accord avec Nick. Mais vous pouvez faire ce que vous faites de toute façon.

Si 'a' est de type 'réel',

a := Real(aList.Items[i]^); 

ou si 'a' est un pointeur vers un réel (^ Real),

a := aList.Items[i]; 

pour cordes, stocker les adresse du premier élément (bien sûr, vous devez tester des chaînes vides),

s := 'Hello World'; 
aList.Add(@S[1]); 
[...] 
s1 := string(aList[i]); 

ou utiliser un « PChar » et stocker l'adresse où il pointe,

s := 'Hello World'; 
aList.Add(@s^); 
[...] 
s1 := PChar(aList[i]); 
Questions connexes