Pourquoi ne puis-je effectuer cette opération:Quelle est la différence entre pchar et PByte
var
data:pbyte;
x:int64;
o:pointer;
begin
o:=data+x;
end;
Pourquoi ne puis-je effectuer cette opération:Quelle est la différence entre pchar et PByte
var
data:pbyte;
x:int64;
o:pointer;
begin
o:=data+x;
end;
PChar est un pointeur vers un char, mais il reçoit un soutien spécial du compilateur pour permettre l'arithmétique de pointeur pour faire comme C manipulations de chaînes plus faciles dans Delphi. PByte est simplement un ancien pointeur typé, et ne reçoit aucune attention particulière du compilateur pour permettre l'arithmétique du pointeur.
Dans Delphi 2009, a new compiler directive was introduced ($ POINTERMATH ON/OFF) qui vous permet d'ajouter la prise en charge du compilateur pour l'arithmétique du pointeur à vos propres déclarations de type de pointeur.
En fait, les mathématiques du pointeur de style Inc() et Dec() ont fonctionné pendant des siècles (voir http://www.delphi3000.com/articles/article_2224.asp); Delphi 2009 ajoute désormais suport pour arithmic dans le style MyPInt [index] si vous activez cette directive (voir http://rvelthuis.de/articles/articles-pointers.html). –
merci pour info, y a-t-il une chance que je puisse atteindre en delphi 7? : S – steve0
Non, Steve. Delphi 7 a été publié il y a une dizaine d'années, et il y a eu cinq versions ultérieures. Il n'y aura pas d'autres versions de cette version. Ce que vous avez maintenant, c'est tout ce que vous aurez à faire, sauf si vous passez à une nouvelle version. –
pbyte = ^byte;
pchar = ^char;
Dans les anciennes versions Delphi (avant D2009), SizeOf(char)
= SizeOf(byte)
, à savoir 8 bits. Dans D2009 et plus tard, char
est de 16 bits alors que byte
reste à 8 bits, de sorte que:
SizeOf(byte)=1
SizeOf(char)=2
Pour permettre la modification des pointeurs par exemple en ajoutant des valeurs, etc., vous pouvez utiliser $POINTERMATH ON
(disponible en D2009 et versions ultérieures, voir here). L'alternative est de suivre le modèle:
NewPointer:= Pointer(Integer(OldPointer)+IntegerValue)
Edit1 - Notez que (comme indiqué dans les commentaires à une autre réponse), aussi inc()
et dec()
travaille avec des pointeurs typés; ils vont incrémenter/décrémenter un PMyType par SizeOf (TMyType). Edit2 - Pour assurer la pérennité de votre code, vous devriez considérer que SizeOf (Pointer) changera probablement dans les futures versions Delphi 64 bits, de sorte que la relation SizeOf(Integer)=SizeOf(Pointer)
ne tiendra plus. Pour contourner cela, les versions récentes de Delphi définissent les types NativeInt
et NativeUInt
, qui sont des entiers de la même taille qu'un pointer
.
Définissez et commencez à utiliser un type distinct pour diffuser des pointeurs sur des entiers. Bientôt, un pointeur ne rentre plus dans un entier. (En raison de 64 bits). –
@Marco - Oui, bon point.Il y a NativeInt/NativeUInt dans les versions récentes de Delphi. Je vais ajouter cela à ma réponse. – PhiS
Notez que Inc et Dec ne fonctionnent que sur les pointeurs typés, par ex. PByte, pas sur non typé (pointeur). Vous devrez peut-être utiliser quelque chose comme 'type NativeInt: LongInt; ... o: = Pointeur (NativeInt (Data) + x * SizeOf (octet));' –
Juste un punt, mais est un 'pchar' 16 bits et un' pbyte' 8 bits, car 'char' et' byte' sont en C#? – kbrimington
En D2009 et plus tard, 'Char' est 16 bits, oui. Dans les versions antérieures, il s'agit de 8 bits. –
Pourquoi essayez-vous d'utiliser un entier 64 bits (Int64) pour l'arithmétique du pointeur dans un langage 32 bits? Je suggère d'utiliser Cardinal à la place. –