Page 1 sur 2
boucle ...
Publié : sam. 04/avr./2009 15:20
par jerexgrz
J'ai un message d'erreur dans ce petit bout de code :
Code : Tout sélectionner
Dim tab.l (10,10,10)
numero.l
def.s
z.l = 1
For z = 1 To 18
If z = 14
def = "go_error"
Else
def ="rien"
EndIf
If def = "go_error"
numero = z
Break
EndIf
Next z
tab(10,10,z) = 20
Debug tab(10,10,z)
Debug z
Debug def
Debug "===="
Normalement, le fait de declarer la variable Z correspond à un endroit memoire :ex: 12354AB1233
Bien que, je fasse une boucle avec une variable Z (le meme nom que la variable), c'est une variable temporaire. Elle devrait etre declarer dans une nouvelle zone memoire. ex: 1235AB1245
D'après la doc :
La lettre k après le mot clef Next indique que ce Next ferme la boucle "For k".
Logiquement, next z ne devrait plus exister (1235AB1245) et sa valeur non plus.
Hors, avec le tableau, on voit que la valeur de Z (de la boucle) est transmise à la variable Z.
Donc, est ce qu'il ne faudrait pas une alerte dans PB pour eviter ce genre d'incident

Re: boucle ...
Publié : sam. 04/avr./2009 15:30
par Backup
jerexgrz a écrit :
Normalement, le fait de declarer la variable Z correspond à un endroit memoire :ex: 12354AB1233
Bien que, je fasse une boucle avec une variable Z (le meme nom que la variable), c'est une variable temporaire.
pas du tout !!
en purebasic la variable Z c'est la meme !!
si tu fait
t sera remis a 5 tout le temps !!
cela est en fait un gros avantage !!
puisque tu peux eviter des "Step" en faisant
Code : Tout sélectionner
for t=0 to 255
calldebugger
t=t+2 ; remplace un step 3 au final
debug t
next t

Publié : sam. 04/avr./2009 15:46
par Anonyme
un truc a demander a fred , les namespaces.
Publié : sam. 04/avr./2009 15:48
par Backup
Cpl.Bator a écrit :un truc a demander a fred , les namespaces.
qu'appelle tu les "namesspaces" ?

Publié : sam. 04/avr./2009 16:14
par Jagang
Je pense qu'il veut parler des variables comme dans les procédures, qui ne sont pas accessible depuis l'extérieur (sauf dans certain cas)
Publié : sam. 04/avr./2009 17:17
par cha0s
ce n'est pas vraiment sa, en informatique on utilise des namespaces pour différencier des éléments selon un contexte précis.
Exemple
Machin::truc = "salut"
Chose::truc = "coucou"
les variables on le même nom mais viennent d'un contexte différent.
Je sait pas si c'est très clair ^^' mais en gros c'est sa.
c'est utilisé dans certain langage comme le C++, j'utilise aussi les namespaces pour le précompilateur de Chronos lorsque une classe est inclue dans une autre ou encore pour les méthodes statiques.
Publié : sam. 04/avr./2009 17:38
par Backup
ça reviens a donner un nom différent aux variables donc ....
pour rester dans l'exemple
cela reviendrai a ecrire
bref a utiliser une autre variable
ou alors il y a une subtilité qui m'echappe
Publié : sam. 04/avr./2009 17:49
par jerexgrz
pour etre plus precis,
z.l = 4 => cette variable reste en memoire tout le temps
tx.l = 0 => idem
for z=1 to 10 } Je declare une valeur temporaire Z (debut)
z=z+2 } je suis tout à fait d'accord avec toi (Dobro) pour step ...
next z } Et ici, je termine la valeur Z (fin)
debug tx + z => normalement 4 !
J'indique bien à Next que je termine la variable Z. (Next Z)
Publié : sam. 04/avr./2009 17:53
par Backup
jerexgrz a écrit :pour etre plus precis,
z.l = 4 => cette variable reste en memoire tout le temps
tx.l = 0 => idem
for z=1 to 10 } Je declare une valeur temporaire Z (debut)
z=z+2 } je suis tout à fait d'accord avec toi (Dobro) pour step ...
next z } Et ici, je termine la valeur Z (fin)
debug tx + z => normalement 4 !
J'indique bien à Next que je termine la variable Z. (Next Z)
oui mais pas en purebasic !!
Z est "Z" le fait d'etre l'indice de la boucle ne change rien !!
en fait lorsque tu declare z au debut en mettant la valeur 4
par la suite la boucle change le contenu de Z !!
elle commence par lui mettre la valeur 1 ,puis 2, puis 3 etc !!!
il s'agit bien du même tiroir !!!
comme je te le disais, heureusement !!
parce que déjà que purebasic n'accepte pas les variables dans le Step (le vrais) , cela permet de tricher
une boucle ne crée pas de variable "temporaire" pour les boucle for next en purebasic ! you anderstande mister ??

Publié : sam. 04/avr./2009 18:45
par Ollivier
@jerexgrz
Voilà ce que tu veux:
Code : Tout sélectionner
A = 1234
! push [v_A] ; On sauvegarde A dans la pile
For A = 0 To 10
Next
! pop [v_A] ; On récupère A dans la pile
Debug A
Maintenant, est-ce que pour une simple question de commodité, tu serais prêt à sacrifier la vitesse d'exécution?
Publié : sam. 04/avr./2009 19:16
par Backup
Ollivier a écrit :@jerexgrz
Voilà ce que tu veux:
Code : Tout sélectionner
A = 1234
! push [v_A] ; On sauvegarde A dans la pile
For A = 0 To 10
Next
! pop [v_A] ; On récupère A dans la pile
Debug A
Maintenant, est-ce que pour une simple question de commodité, tu serais prêt à sacrifier la vitesse d'exécution?
bah peut etre pas besoin de faire appel a l'assembleur ...
j'utilise une autre variable pour sauver , au lieu de la pile
ça prends un peut plus de place, mais ça marche aussi

Publié : sam. 04/avr./2009 20:07
par jerexgrz
@Dobro
Oui, on s'est bien compris des les 1ers messages.
Tests grosso-modo:
Code : Tout sélectionner
Exemple1
time.l = ElapsedMilliseconds()
For vv = 0 To 200000
A = 1234
mem_A=A
For A = 0 To 10
Next
A=mem_A
Next vv
time2.l = ElapsedMilliseconds()
valeur.l = time2 - time
Debug valeur
Code : Tout sélectionner
Exemple2
time.l = ElapsedMilliseconds()
For vv = 0 To 200000
A = 1234
! push [v_A] ; On sauvegarde A dans la pile
For A = 0 To 10
Next
! pop [v_A] ; On récupère A dans la pile
Next vv
time2.l = ElapsedMilliseconds()
valeur.l = time2 - time
Debug valeur
C'est vrai, il y a une difference de vitesse.
1er exemple, je suis à 140
2eme, je suis à 125 !
Publié : sam. 04/avr./2009 20:26
par Backup
jerexgrz a écrit :
C'est vrai, il y a une difference de vitesse.
1er exemple, je suis à 140
2eme, je suis à 125 !
sauf que ton emploi de "Debug" m'indique que tu test la vitesse avec le debugger on !!
hors , pour avoir de vrais resultat de test , il ne faut pas activer le debugger !!
et utiliser un requester par exemple !!
reesaye la :
Code : Tout sélectionner
time.l = ElapsedMilliseconds()
For vv = 0 To 200000
A = 1234
mem_A=A
For A = 0 To 10
Next
A=mem_A
Next vv
time2.l = ElapsedMilliseconds()
valeur.l = time2 - time
MessageRequester("résultat","temps= "+Str(valeur))
time.l = ElapsedMilliseconds()
For vv = 0 To 200000
A = 1234
! push [v_A] ; On sauvegarde A dans la pile
For A = 0 To 10
Next
! pop [v_A] ; On récupère A dans la pile
Next vv
time2.l = ElapsedMilliseconds()
valeur.l = time2 - time
MessageRequester("résultat","temps= "+Str(valeur))
chez moi pas de difference

Publié : sam. 04/avr./2009 23:52
par Ollivier
Moi je vous dirais que je n'arrive pas à avoir un test fiable. Malgré les temps repos avant de commencer les tests c'est toujours le premier test qui est perdant quelque soit l'algo.!!! Ceci dit je suis étonné par la vitesse avec laquelle il s'occupe de la pile...
Code : Tout sélectionner
Define A.I
Define B.I
Define C.I
Define D.I
Define E.I
inter = 1
OpenWindow(0, 0, 0, 400, 200, "Question")
TextGadget(0, 16, 16, 350, 20, "Choose a test order:")
ButtonGadget(1, 16, 64, 350, 24, "First test = normal, second test = add stack statements")
ButtonGadget(2, 16, 112, 350, 24, "First test = add stack statements, second test = normal")
TextGadget(3, 16, 160, 350, 20, "(Test results will be displayed in the console screen)")
Repeat
EventID = WaitWindowEvent()
Select EventGadget()
Case 1
inter = 0
Goto Continu
Case 2
inter = 1
Goto Continu
EndSelect
Until EventID = 16
CloseWindow(0)
End
Continu:
CloseWindow(0)
Delay(500)
Global Dim Duree.I(5, 2)
Max = 1 ; <<<<<<<<<<<<<<<<<<< NOMBRE DE TEST (ATTENTION!)
; Pas trop quand même!!!
*XX = AllocateMemory(1 << 24)
For I = 1 To Max
MessageRequester("", "Test " + Str(I) + "/" + Str(Max) )
Delay(500)
Total = 1
For J = 1 To I
Total * 10
Next J
If inter: Goto b: EndIf
a:
T0.I = ElapsedMilliseconds()
For vv = 0 To Total
For A = 0 To 10
For B = 0 To 10
For C = 0 To 10
For D = 0 To 10
For E = 0 To 10
PokeB(*XX + Random(1 << 24 - 1), PeekB(*XX + Random(1 << 24 - 1) ) )
Next
Next
Next
Next
Next
Next vv
T1.I = ElapsedMilliseconds()
Valeur1.I = T1 - T0
If inter: Goto c: EndIf
b:
T2.I = ElapsedMilliseconds()
For vv = 0 To Total
! push [v_A] ; On sauvegarde A dans la pile
For A = 0 To 10
! push [v_B] ; On sauvegarde B dans la pile
For B = 0 To 10
! push [v_C] ; On sauvegarde C dans la pile
For C = 0 To 10
! push [v_D] ; On sauvegarde D dans la pile
For D = 0 To 10
! push [v_E] ; On sauvegarde E dans la pile
For E = 0 To 10
PokeB(*XX + Random(1 << 24 - 1), PeekB(*XX + Random(1 << 24 - 1) ) )
Next
! pop [v_E] ; On récupère E dans la pile
Next
! pop [v_D] ; On récupère D dans la pile
Next
! pop [v_C] ; On récupère C dans la pile
Next
! pop [v_B] ; On récupère B dans la pile
Next
! pop [v_A] ; On récupère A dans la pile
Next vv
T3.I = ElapsedMilliseconds()
Valeur2.I = T3 - T2
If inter: Goto a: EndIf
c:
Duree(I, 0) = Total
Duree(I, 1) = Valeur1
Duree(I, 2) = Valeur2
Next
OpenConsole()
PrintN("N REP NORM STACK DELTA")
For I = 1 To Max
Print(RSet(Str(Duree(I, 0) ), 6, "0") + " ")
Print(RSet(Str(Duree(I, 1) ), 6, "0") + " ")
Print(RSet(Str(Duree(I, 2) ), 6, "0") + " ")
n = - ((Duree(I, 2) - Duree(I, 1) ) * 100 ) / Duree(I, 1)
PrintN(RSet(Str(Int(n) ), 5, " ") + "%")
Next
PrintN(" ")
PrintN("N REP = Number of repetition")
PrintN("NORM = (DURATION) NORMAL FOR...NEXT LOOP (MS)")
PrintN("STACK = (DURATION) FOR...NEXT LOOP WITH PUSH AND POP STATEMENTS (MS)")
PrintN("DELTA = PERCENTAGE OF TIME EVOLUTION BETWEEN THE FIRST AND THE 2ND TEST")
PrintN("Press [Enter] to quit...")
Input()
CloseConsole()
Publié : dim. 05/avr./2009 8:30
par tonton
vos deux boucles desassemblées!
Code : Tout sélectionner
DOBRO
MOV dword [v_A],1234 / A = 1234
PUSH dword [v_A] / mem_A=A
POP dword [v_mem_A]
MOV dword [v_A],0 /For A = 0 To 10 :next
MOV eax,10
CMP eax,dword [v_A]
JL _Next2
INC dword [v_A]
JMP _For1
PUSH dword [v_mem_A] / A=mem_A
POP dword [v_A]
OLLIVIER
MOV dword [v_A],1234 / A = 1234
PUSH [v_A] / mem_A=A
MOV dword [v_A],0 /For A = 0 To 10 :next
MOV eax,10
CMP eax,dword [v_A]
JL _Next2
INC dword [v_A]
JMP _For1
POP [v_A] / A=mem_A
Celle d' Ollivier gagne deux intsructions, mais en dehore de la boucle .
La boucle reste inchangée dans les deux cas..
Dobro a raison, c' est pareil!!!!!( ou presque)
Mais les deux instuctions gagnées se trouvent dans la boucle de teste
soit 400 000 intructions de moins, il devait y avoir une difference réel .