Tableau statique + pointeur + For/Next

Archive.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Tableau statique + pointeur + For/Next

Message par Dräc »

Alors que le code suivant marche,

Code : Tout sélectionner

Structure test
  a.l[3]
EndStructure

b=30
c=40
d=50

test.test
test\a[0]=b
test\a[1]=c
test\a[2]=d

For i=0 To 2
  Debug test\a[i]
Next

Debug test\a[0]
Debug test\a[1]
Debug test\a[2]
La version avec pointeur pêche au niveau de la boucle For/Next ! Pourquoi ?!

Code : Tout sélectionner

 Structure test
  *a.LONG[3]
EndStructure

b=30
c=40
d=50

test.test
test\a[0]=@b
test\a[1]=@c
test\a[2]=@d

For i=0 To 2
  Debug test\a[i]\l
Next

Debug test\a[0]\l
Debug test\a[1]\l
Debug test\a[2]\l
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

On dirait que le pointeur ne supporte pas de variables d'index pour le tableau.

C'est ennuyeux, j'espère que ça pourra être corriger rapidement.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Pour ceux que cela intéresse, la seule parade que j’ai trouvé est de passer par un pointeur intermédiaire :

Code : Tout sélectionner

Structure test
  *a.LONG[3]
EndStructure

b=30
c=40
d=50

test.test
test\a[0]=@b
test\a[1]=@c
test\a[2]=@d


For i=0 To 2
  *pt.LONG= test\a[i]
  Debug *pt\l
Next

Debug test\a[0]\l
Debug test\a[1]\l
Debug test\a[2]\l
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

C'est bien un bug, le code asm dans la boucle utilise le registre ebp mais on ne lui ajoute rien (ebp+4 etc) ce qui fait que l'on a seulement la 1ere valeur.

Si on compile ton code avec l'assembleur en ligne activé, le compilateur donne une erreur ligne 16, la variable n'a pas de structure.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Je pense que le pb de l’exemple suivant est connexe :
Il montre sur un cas plus simple que l’utilisation de variables issues de structures, peuvent être mal interprétées dans PB.

Code : Tout sélectionner

pt.POINT

Debug "--------- Boucle 1 ---------"
For pt\x=0 To 10
  Debug pt\x
Next

Debug "--------- Boucle 2 ---------"
For pt\y=0 To 10
  Debug pt\y
Next

Debug "--------- Boucle 3 ---------"
For pt\x=0 To 10
  For pt\y=0 To 10
    Debug Str(pt\x)+" / "+Str(pt\y)
  Next 
Next
Si on regarde le code asm au niveau de la 2ieme boucle,

Code : Tout sélectionner

; Debug "--------- Boucle 2 ---------"
; For pt\y=0 To 10
	LEA    ebp,[v_pt]
	MOV    dword [ebp+4],0
_For3:
	MOV    eax,10
	CMP    eax,dword [v_pt]
	JL    _Next4
; Debug pt\y
; Next
_NextContinue4:
	INC    dword [v_pt]
	JMP   _For3
_Next4:
on constate bien un problème d’indice au niveau des instructions CMP et INC
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

J’espère mieux centrer le problème évoqué dans le premier post :
Les boucles For/Next marchent sur une variable typée par une structure,
Mais pose problème si la variable est remplacée par un pointeur.

Avec une variable typée par une structure

Code : Tout sélectionner

Structure test 
  a.LONG[3] 
EndStructure 

b=30 
c=40 
d=50 

test.test 
test\a[0]\l=b 
test\a[1]\l=c 
test\a[2]\l=d 

For i=0 To 2 
  Debug test\a[i]\l 
Next 

Debug test\a[0]\l 
Debug test\a[1]\l 
Debug test\a[2]\l
La meme chose avec un pointeur (meme exemple que le premier post)

Code : Tout sélectionner

Structure test 
  *a.LONG[3] 
EndStructure 

b=30 
c=40 
d=50 

test.test 
test\a[0]=@b 
test\a[1]=@c 
test\a[2]=@d 

For i=0 To 2 
  Debug test\a[i]\l 
Next 

Debug test\a[0]\l 
Debug test\a[1]\l 
Debug test\a[2]\l
Répondre