Si j'ai bien tout compris, les pointeurs déclarés dans Pure Basic sont de type void et ne sont donc pas typé, mais on peut voir certains exemples de code dans l'aide qui utilise des pointeurs typés.
Un pointeur à la base stock une adresse.
Si tu veux connaitre le contenue de cette adresse, tu dois typer le pointeur pour qu'il sache quoi te rendre (Long, word, byte...)
Dernière modification par Dräc le lun. 22/nov./2004 21:52, modifié 1 fois.
; An example which is only for advanced users
NewList numbers.w()
AddElement(numbers())
numbers() = 5
AddElement(numbers())
numbers() = 8
*element.w = FirstElement(numbers())
If *element
MessageRequester("Information", "First element value is "+Str(PeekW(*element+8)), #PB_MessageRequester_OK)
Else
MessageRequester("Information", "List is empty", #PB_MessageRequester_OK)
EndIf
*element.w (ici le type Word n'est pas pris en compte par le compilateur car *element peut pointer vers n'importe quel type de variable)
Je pense qu'ici le pointeur est de type void et ne devrait pas être typé bien que ce ne soit pas pris en compte par le compilateur, on ne devrait pas l'écrire ainsi qu'en penses-tu?
C'est vrai qu'en PB on peut faire pointer n'importequel pointeur sur n'importequoi, le compilo s'en fout complètement...
En fait, le type du pointeur défini seulement la façon dont sera manipulée la mémoire pointée, le reste est sous l'entière responsabilité du programmeur.
Sinon, c'est vrai que "*ptr.w" n'a pas de sens. "*ptr.WORD" serai plus correct.
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
L’exemple que tu donnes n’a rien de contradictoire.
*element pointe une adresse
A partir de cette adresse tu peux lire un Long, un Word ou autre.
Ainsi tu pourras toujours ecrire PeekL(*element) meme si *element est de type Word (*element.w)
En fait pour moi *element\w est équivalent à PeekW(*element)
Tiens un bout de mon prog qui illustre la lecture d'une valeur à une adresse donnée
Structure MultiTypes
StructureUnion
b.b
w.w
l.l
EndStructureUnion
EndStructure
Procedure.l GetValue(*adress.MultiTypes, Type.b);/ Return the value at the adress according to type format
Select Type
Case #Byte
ProcedureReturn *adress\b
Case #Word
ProcedureReturn *adress\w
Case #Long
ProcedureReturn *adress\l
EndSelect
EndProcedure
Procedure SetValue(*adress.MultiTypes,Type.b,val.l);/ Set the value vat at the adress according to type format
Select Type
Case #Byte
*adress\b = val
Case #Word
*adress\w = val
Case #Long
*adress\l = val
EndSelect
EndProcedure
Dernière modification par Dräc le lun. 22/nov./2004 21:30, modifié 1 fois.
Ok, grace a filperj je viens de comprendre ce qui te tracassais nico.
Effectivement *element.w n'a pas vraiment de sens et c'est bien *element.WORD qu'il faut comprendre...
Tiens, un peu dans le meme genre, j’avais noté ceci :
L’adresse de l’élement courant d’une liste chaine MyList() peut etre obtenue
Soit par
a = @MyList()
soit directement par
a = MyList()
Il me semble de @MyList() est la plus correcte et pourtant…
nico a écrit :Il est à noter qu'en Pure Basic le pointeur s'incrémente toujours d'un octet quel que soit son type ce qui n'est pas vrai en langage C par exemple.
; Je précise que je ne programme pas en C
; mais c'est le langage de référence.
Test.l=$11223344
*Pointeur.WORD = @Test
Debug *Pointeur\w ; = $3344
; Ici il faut incrémenter le pointeur de deux octets
; pour lire la valeur Word suivante.
; Le type du pointeur n'est pas pris en compte,
; alors qu'en C, en ajoutant 1, le pointeur s'incrémente
; de la longueur de son type déclaré.
*Pointeur = *Pointeur + 2
Debug *Pointeur\w ; = $1122