boucle ...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jerexgrz
Messages : 279
Inscription : dim. 05/juin/2005 20:27

boucle ...

Message 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 :?:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: boucle ...

Message 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

Code : Tout sélectionner

for t=1 to 25
t=5
next t
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
:)
Anonyme

Message par Anonyme »

un truc a demander a fred , les namespaces.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Cpl.Bator a écrit :un truc a demander a fred , les namespaces.
qu'appelle tu les "namesspaces" ? 8O
Jagang
Messages : 95
Inscription : sam. 10/janv./2009 18:55
Contact :

Message 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)
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ça reviens a donner un nom différent aux variables donc ....

pour rester dans l'exemple
cela reviendrai a ecrire

Code : Tout sélectionner

for z= 1 to 25
autre_z=5
next z

bref a utiliser une autre variable 8O

ou alors il y a une subtilité qui m'echappe
jerexgrz
Messages : 279
Inscription : dim. 05/juin/2005 20:27

Message 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)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ?? :lol:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ... :)

Code : Tout sélectionner


A = 1234
mem_A=A
For A = 0 To 10
Next
A=mem_A 

Debug A
j'utilise une autre variable pour sauver , au lieu de la pile
ça prends un peut plus de place, mais ça marche aussi :)
jerexgrz
Messages : 279
Inscription : dim. 05/juin/2005 20:27

Message 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 !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ;)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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()
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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) :o

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 .
Répondre