Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527 Inscription : ven. 23/janv./2004 18:10
Message
par Dr. Dri » dim. 07/août/2005 21:58
L'idée c'est de se servir des pointeurs comme en C... C'est à dire pouvoir pointer après l'objet que l'on pointe.
Comment ca c'est pas clair ?
Un ptit code c'est plus parlant ^^
Code : Tout sélectionner
Structure Bytes
b.b[1]
EndStructure
chaine.s = "PureBasic"
length.l = Len(chaine)
DisableDebugger
;l'astuce nécessite de désactiver le débuger :(
;sinon il râle comme quoi l'indice est hors limite :P
i = 0
*p.Bytes = @chaine
While i < length
MessageRequester("Lettre " + Str(i+1), Chr( *p\b[i] ))
i + 1
Wend
;une variante
; i = 0
; max = 12
;
; While i < max
; MessageRequester("Lettre " + Str(i+1), Chr( *p\b[i % length] ))
; i + 1
; Wend
EnableDebugger
L'avantage c'est qu'on peut conserver un pointeur de référence de cette manière, sans avoir besoin d'une seconde variable...
Dri
Dernière modification par
Dr. Dri le dim. 21/août/2005 18:23, modifié 1 fois.
filperj
Messages : 395 Inscription : jeu. 22/janv./2004 1:13
Message
par filperj » lun. 15/août/2005 20:43
Intéressant
Et en définissant ta structure comme ça, pas besoin de désactiver le débogueur:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Dr. Dri
Messages : 2527 Inscription : ven. 23/janv./2004 18:10
Message
par Dr. Dri » lun. 15/août/2005 20:53
Cool ! Encore plus intéressant avec ton astuce
Code : Tout sélectionner
Structure Bytes
b.b[0]
EndStructure
chaine.s = "PureBasic"
length.l = Len(chaine)
i = 0
*p.Bytes = @chaine
While i < length
Debug Chr( *p\b[i] )
i + 1
Wend
;une variante
Debug "---"
i = 0
max = 12
While i < max
Debug Chr( *p\b[i % length] )
i + 1
Wend
Dri
Dräc
Messages : 526 Inscription : dim. 29/août/2004 0:45
Message
par Dräc » mar. 16/août/2005 22:01
Bien vu ! Par contre, je ne saisi pas la traduction en ASM !
La fin du code suivant
Code : Tout sélectionner
Structure Bytes
b.b[0]
EndStructure
chaine.s = "PureBasic"
length.l = Len(chaine)
*p.Bytes = @chaine
*p\b[1]
*p\b[2]
*p\b[3]
*p\b[8]
produit le code ASM suivant:
Code : Tout sélectionner
; *p.Bytes = @chaine
MOV eax,dword [v_chaine]
MOV dword [p_p],eax
;
; *p\b[1]
MOV ebp,dword [p_p]
; *p\b[2]
MOV ebp,dword [p_p]
; *p\b[3]
MOV ebp,dword [p_p]
;
; *p\b[8]
MOV ebp,dword [p_p]
Je ne vois pas comment est faite la distinction des différentes adresses ?!
Dr. Dri
Messages : 2527 Inscription : ven. 23/janv./2004 18:10
Message
par Dr. Dri » mar. 16/août/2005 22:06
effectivement je ne comprends pas tout... C'est peut être dû au fait que tu n'utilises pas le pointeur en tant qu'instruction... En gros les 4 lignes concernées ne font strictement rien... As-tu essayé en faisant par exemple ceci ?
Dri
PS. le "p_p" on dirait un smiley
comme le T_T
fweil
Messages : 505 Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :
Message
par fweil » mar. 16/août/2005 23:02
...,
En fait si tu écris simplement :
Le compilateur décide apparement qu'il n'y a rien à en faire et il ne pointe pas l'élément à l'intérieur du tableau.
Si tu fais :
le compilateur prends effectivement l'élément dans le tableau (adresse indicée).
Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dräc
Messages : 526 Inscription : dim. 29/août/2004 0:45
Message
par Dräc » mer. 17/août/2005 20:00
C’est ca en effet !
Un *p\b[1] tout seul ne produit rien
Par contre en proposant une affectation par exemple, on force le compilo à expliciter…
En fait, je ne pouvais pas le voir en faisant simplement Debug *p\b[1]
Code : Tout sélectionner
Structure Bytes
b.b[0]
EndStructure
chaine.s = "PureBasic"
length.l = Len(chaine)
*p.Bytes = @chaine
a = *p\b[1]
b = *p\b[2]
c = *p\b[3]
d = *p\b[8]
Debug Chr(a)
Debug Chr(b)
Debug Chr(c)
Debug Chr(d)
conduit à cet extrait:
Code : Tout sélectionner
;
; a = *p\b[1]
MOV ebp,dword [p_p]
MOVSX eax,byte [ebp+1]
PUSH eax
POP dword [v_a]
LeCyb
Messages : 273 Inscription : dim. 26/déc./2004 20:49
Message
par LeCyb » dim. 21/août/2005 1:25
Super cool le coup du zéro pasque sans le debug c'est plutôt ennuyant
Vive le thread-safe !
Dr. Dri
Messages : 2527 Inscription : ven. 23/janv./2004 18:10
Message
par Dr. Dri » dim. 21/août/2005 18:13
Voila un exemple concret de ce qu'on peut faire avec... elle est pas super simple la procédure ???
Du code propre ca aide quand même ^^
Code : Tout sélectionner
Structure Bytes
b.b[0]
EndStructure
Procedure XorMemory(*Memory.Bytes, MemoryLength.l, *Key.Bytes, KeyLength.l)
Protected XorMemory.l, i.l, j.l
If *Memory And *Key And MemoryLength > 0 And KeyLength > 0
While i < MemoryLength
If j = KeyLength : j = 0 : EndIf
*Memory\b[i] ! *Key\b[j]
i + 1
j + 1
Wend
XorMemory = #True
EndIf
ProcedureReturn XorMemory
EndProcedure
;-test de la procedure
chaine.s = "un essai de xor avec mes pointeurs tableaux"
cle.s = "voici la clé de cryptage"
length = Len(chaine) ;elle risque de changer apres cryptage
Debug chaine
XorMemory(@chaine, length, @cle, Len(cle))
Debug chaine
XorMemory(@chaine, length, @cle, Len(cle))
Debug chaine
Dri