Page 1 sur 2

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

Publié : dim. 12/juil./2009 17:22
par Backup
.........................

Publié : ven. 17/juil./2009 12:56
par Backup
.............................

Publié : ven. 17/juil./2009 14:36
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.

Publié : ven. 17/juil./2009 15:51
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 :)

Publié : ven. 17/juil./2009 17:18
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 ?

Publié : ven. 17/juil./2009 18:24
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

Publié : ven. 17/juil./2009 18:40
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)

Publié : ven. 17/juil./2009 22:19
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

Publié : ven. 17/juil./2009 23:53
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 *****

Publié : sam. 18/juil./2009 2:36
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  

Publié : sam. 18/juil./2009 8:18
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

Publié : sam. 18/juil./2009 8:41
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

Publié : sam. 18/juil./2009 9:07
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 :)

Publié : sam. 18/juil./2009 9:46
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

Publié : sam. 18/juil./2009 11:02
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.