2010-08-04 4 views
2

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; 
+0

Juste un punt, mais est un 'pchar' 16 bits et un' pbyte' 8 bits, car 'char' et' byte' sont en C#? – kbrimington

+2

En D2009 et plus tard, 'Char' est 16 bits, oui. Dans les versions antérieures, il s'agit de 8 bits. –

+1

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. –

Répondre

11

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.

+1

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). –

+0

merci pour info, y a-t-il une chance que je puisse atteindre en delphi 7? : S – steve0

+2

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. –

3
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.

+2

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). –

+1

@Marco - Oui, bon point.Il y a NativeInt/NativeUInt dans les versions récentes de Delphi. Je vais ajouter cela à ma réponse. – PhiS

+0

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));' –

Questions connexes