Page 1 sur 1
Tableau statique + pointeur + For/Next
Publié : dim. 10/avr./2005 18:12
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
Publié : dim. 10/avr./2005 18:37
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.
Publié : dim. 10/avr./2005 18:37
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
Publié : dim. 10/avr./2005 18:50
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.
Publié : dim. 10/avr./2005 19:42
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
Publié : mer. 20/avr./2005 21:04
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