Pointeur "tableau" calqué sur le C + exemple Xor

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Pointeur "tableau" calqué sur le C + exemple Xor

Message par Dr. Dri »

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 ? :lol:
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 »

Intéressant :D

Et en définissant ta structure comme ça, pas besoin de désactiver le débogueur:

Code : Tout sélectionner

Structure Bytes
  b.b[0]
EndStructure
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 »

Cool ! Encore plus intéressant avec ton astuce :D

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 :10:
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

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 »

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 ?

Code : Tout sélectionner

*p\b[8] = 'A'
Dri

PS. le "p_p" on dirait un smiley :lol: comme le T_T
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

...,

En fait si tu écris simplement :

Code : Tout sélectionner

*p\b[1]
*p\b[2]
*p\b[3]
*p\b[8]
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 :

Code : Tout sélectionner

Chr(*p\b[1])
Chr(*p\b[2])
Chr(*p\b[3])
Chr(*p\b[8])
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 »

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 »

Super cool le coup du zéro pasque sans le debug c'est plutôt ennuyant :D
Vive le thread-safe !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Voila un exemple concret de ce qu'on peut faire avec... elle est pas super simple la procédure ??? 8)
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 ;)
Répondre