..................

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

..................

Message par Backup »

.........................
Dernière modification par Backup le ven. 07/oct./2011 12:20, modifié 2 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

.............................
Dernière modification par Backup le sam. 19/mars/2011 16:44, modifié 1 fois.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Intéressant, merci.

Petite remarque, je pense que

Code : Tout sélectionner

  Structure MemoryArray 
    Byte.c[0] 
  EndStructure 
  Global Dim AllowedChar.c(255) 
  For i = '0' To '9' 
    AllowedChar(i) = 1 
  Next 
  For i = 'A' To 'Z' 
    AllowedChar(i) = 1 
  Next 
  For i = 'a' To 'z' 
    AllowedChar(i) = 1 
  Next
devrait être à l'extérieur de la procédure gnozal_Remplace(), çà éviterait d'initialiser le tableau [global] AllowedChar() à chaque appel de cette procédure.
On peut placer ce bloc juste après

Code : Tout sélectionner

Global FontID1 
FontID1 = LoadFont(1, "Arial", 14)
au début du code par exemple.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui tu as raison !

aussi je pense que dans le cadre d'une procedure
c'est dommage de na pas pouvoir beneficier d'une zone
qui ne s'initialise qu'une fois :)

genre

procedure toto(a,b,c)
zone_init
structure
bla
bla
endstucture
dim tableau (x,y)
end_zone


; ici procedure standard

bla bla
bla
bla
endprocedure


ceserai cool , on pourrai avoir des procedure
qui soit vraiment des petit prg dans le prg :)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

D'ailleurs j'ai un doute.

Normalement, on doit pouvoir faire ce que tu dis grâce à la commande Defined().

Code : Tout sélectionner

Procedure toto()
	
	If Defined(TestArray, #PB_Array) = #False
		Debug "Global Dim TestArray(10) "
		Global Dim TestArray(10) 
		TestArray(0) = 10
		TestArray(1) = 11
		TestArray(2) = 12
	EndIf
	
EndProcedure

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)
Dans ce programme, normalement au deuxième passage (appel à la fonction toto) le tableau étant Global devrait être Defined() = #True mais non...

Qu'en pensez vous ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui c'est zarbi !! :)

le problem viens de la fonction Defined()
qui ne tiens pas compte du context !!

dans une procedure , cette fonction reste locale !

donc forcement des qu'on sort de la procedure; elle se réinitialise
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonsoir
ça n'as pas l'air de fonctionner non plus hors procedure
cordialement

Code : Tout sélectionner

;Procedure toto()
       For i=0 To 3
		Debug Defined(TestArray, #PB_Array)
		If Defined(TestArray, #PB_Array) = #False
		   Debug "Global Dim TestArray(10) "
	     	Debug Defined(TestArray, #PB_Array)
				Global Dim TestArray(10) 
				TestArray(0) = 10
				TestArray(1) = 11
				TestArray(2) = 12
		EndIf
		Next i
;EndProcedure

;toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

;toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Message par PAPIPP »

Bonjour à tous
Pour mois ça fonctionne très bien dans les 2 cas
Exemple procédure

Code : Tout sélectionner

Procedure toto()
; Defined détermine si un objet tel qu'une structure, interface, variables etc. est déjà défini dans le programme.
;  Le paramètre 'Nom' doit être spécifié sans aucune forme de décoration (sans le '#' pour une constante,
;  sans LES '()' pour un tableau, une liste chaînée ou une procédure).
; 
; Le paramètre 'Type' peut être une des valeurs suivantes:
;   #PB_Constant
;   #PB_Variable
;   #PB_Array
;   #PB_LinkedList
;   #PB_Structure
;   #PB_Interface
;   #PB_Procedure
; 
; Exemple:
; 

   
   If Defined(TestArray, #PB_Array) = #False
      Debug "Global Dim TestArray(10) "
      Global Dim TestArray(10)
      TestArray(0) +10
      TestArray(1) +11
      TestArray(2) +12
   EndIf
   
EndProcedure

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)
Vous pouvez remarquer que vous n'avez qu'une seule fois l'incrémentation

Exemple 2 dans un Prg

Code : Tout sélectionner

;Procedure toto()
Goto fin_sub:
sub3:
       For i=0 To 3
      Debug Defined(TestArray, #PB_Array)
      If Defined(TestArray, #PB_Array) = #False
         Debug "Global Dim TestArray(10) "
           Debug Defined(TestArray, #PB_Array)
            Global Dim TestArray(10)
            TestArray(0) +10+1
            TestArray(1) + 11+i
            TestArray(2) + 12+i
      EndIf
      Next i
Return 
fin_sub:
;EndProcedure

;toto()
Gosub sub3
Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

;toto()
Gosub sub3
Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2) 

Gosub sub3
Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)
End

Ici aussi vous n'avez qu'une seule fois l'incrémentation
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@PAPIPP tu utilise quel version de purebasic ?

parce que chez moi (V 4.31)ton exemple ne marche pas plus !!

il recrée le tableau a chaque fois !!
toujours a #False

je te soupsconne d'utiliser la V4.30
et du coup demande pourquoi ?

******* hum *****
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonjour
defined() détecte bien le tableau? mais lorsque que celui à été crée en amont.

Avec le second exemple de @PAPIPP le test fonctionne en mettant le tableau en début de programme!
mince alors!
cordialement

Code : Tout sélectionner

Global Dim TestArray(10)
Goto fin_sub: 
sub3: 
    For i=0 To 3 
    
   If Defined(TestArray, #PB_Array) = #False 
     Debug "Global Dim TestArray(10) " 
      Debug Defined(TestArray, #PB_Array) 
      
      TestArray(0) + 10+1 
      TestArray(1) + 11+i 
      TestArray(2) + 12+i 
  EndIf 
   Next i 
Return  
fin_sub: 
;EndProcedure 
 
;toto() 
Gosub sub3 
Debug TestArray(0) 
Debug TestArray(1) 
Debug TestArray(2) 
 
;toto() 
Gosub sub3 
Debug TestArray(0) 
Debug TestArray(1) 
Debug TestArray(2)  
 
Gosub sub3 
Debug TestArray(0) 
Debug TestArray(1) 
Debug TestArray(2) 
End  
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Dobro a écrit :aussi je pense que dans le cadre d'une procedure
c'est dommage de na pas pouvoir beneficier d'une zone
qui ne s'initialise qu'une fois :)
On peut le faire avec des variables statiques.

Code : Tout sélectionner

  Static AllowedCharInitialized
  If AllowedCharInitialized = #False
    For i = '0' To '9' 
      AllowedChar(i) = 1 
    Next 
    For i = 'A' To 'Z' 
      AllowedChar(i) = 1 
    Next 
    For i = 'a' To 'z' 
      AllowedChar(i) = 1 
    Next 
    AllowedCharInitialized = #True
  EndIf
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Message par PAPIPP »

Bonjour à tous
@Dobro
J'utilise bien la version PB 4.31
voici les résultats du premier prg

Code : Tout sélectionner

Global Dim TestArray(10) 
10
11
12
Global Dim TestArray(10) 
10
11
12
Global Dim TestArray(10) 
10
11
12
Et ici ceux du deuxième prg

Code : Tout sélectionner

0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
11
14
15
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
11
14
15
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
0
Global Dim TestArray(10) 
0
11
14
15
@Gnozal

Code : Tout sélectionner

On peut le faire avec des variables statiques.
Tout à fait d'accord ici on maitrise tout
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

kernadec a écrit :bonjour
defined() détecte bien le tableau? mais lorsque que celui à été crée en amont.

Avec le second exemple de @PAPIPP le test fonctionne en mettant le tableau en début de programme!
mince alors!
faudrai voir a suivre le fil de la discussion !

le but etant que le tout se passe DANS une procedure !!

il 'a jamais ete question ici d'etre Hors de la procedure !!! :?

Mince alors !!

et j'ajoute et confirme que ceci ( le premier exemple de @PAPIPP )

ne fonctionne pas sur 4.31 ! (le tableau est réinitialisé a chaque fois )
on est deja 3 a le dire ....

@PAPIPP : j'en profite pour te dire que c'etait pas le peine d'ajoutert la doc
dans ton listing , a moins que tu nous prenne pour des bleus .... :?

ça y est j'chui ennervé pour la journée là !! pfffffff! :lol:


cette exemple ne marche pas !!
le tableau est réinitialisé a chaque fois !!
d'ailleurs cet exemple de PAPIPP est en fait la copie carbonne de l'exemple
de Flype ...(la doc en plus) mais bon

Code : Tout sélectionner


Procedure toto()
; Defined détermine si un objet tel qu'une structure, interface, variables etc. est déjà défini dans le programme.
;  Le paramètre 'Nom' doit être spécifié sans aucune forme de décoration (sans le '#' pour une constante,
;  sans LES '()' pour un tableau, une liste chaînée ou une procédure).
;
; Le paramètre 'Type' peut être une des valeurs suivantes:
;   #PB_Constant
;   #PB_Variable
;   #PB_Array
;   #PB_LinkedList
;   #PB_Structure
;   #PB_Interface
;   #PB_Procedure
;
; Exemple:
;

   
   If Defined(TestArray, #PB_Array) = #False
      Debug "Global Dim TestArray(10) "
      Global Dim TestArray(10)
      TestArray(0) +10
      TestArray(1) +11
      TestArray(2) +12
   EndIf
   
EndProcedure

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

toto()

Debug TestArray(0)
Debug TestArray(1)
Debug TestArray(2)

@Gnozal ;: oui effectivement ça marche le static

mais tu admettra que la fonction Defined()
a un comportement etrange :)
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonjour Dobro
restons cool
si cela avait fonctionner hors procédure déjà?
j'aurai poursuivi avec les tests en procédure,
il me semble?

cordialement
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Dobro a écrit :@Gnozal ;: oui effectivement ça marche le static

mais tu admettra que la fonction Defined()
a un comportement etrange :)
Non, pas vraiment.
Defined() intervient au moment de la compilation, pas lors de l'exécution.
Répondre