Page 2 sur 2

Publié : ven. 04/juin/2004 0:19
par KarLKoX
cederavic a écrit :les structures ne sont pa nessecaire, mais elle simplifi beaucoup le code, et le rend par la meme occasion plus lisible/leger ;)
Et c'est plus propre que des variables globales :)

Publié : ven. 04/juin/2004 0:34
par Backup
ta reponse me leve une question suplementaire !!


les champs d'une structure peuvent t'ils etre appelés a partir d'une procedure ??

sont t'ils Globale ou locale dans ce cas ? :)

Publié : ven. 04/juin/2004 0:48
par Chris
Bien sûr!

La variable qui est liée à la structure, (celle qui contient l'adresse), est locale.

Tu peux la rendre globale de la même façon qu'une autre:
Global Info.MaStructure

Ou bien tu peux déclarer une nouvelle variable à l'intérieur de la procédure, faire ce que tu as à faire, et passer son adresse avec ProcedureReturn

Tartempion.MaStructure
...
...
ProcedureReturn @Tartempion

Et pour récupérer les valeurs de la structure à l'exterieur de la procedure, tu fais Info.MaStructure = MaProcedure()

Code : Tout sélectionner

Structure RESULTAT 
  octet.b 
  Mot.w 
  motlong.l 
  Chaine.s 
EndStructure 

Procedure MaProcedure() 
  Result.RESULTAT 
  
  Result\octet   = #True 
  Result\Mot     = 1234 
  Result\motlong = 12345678 
  Result\Chaine  = "Hello World !" 
  ProcedureReturn @Result 
EndProcedure 

*Valeur.RESULTAT = MaProcedure() 
Debug *Valeur\octet 
Debug *Valeur\Mot 
Debug *Valeur\motlong 
Debug *Valeur\Chaine 
Chris :)

Publié : dim. 06/juin/2004 0:30
par filperj
Ah non, :evil:
Une procédure ne doit jamais renvoyer un pointeur vers une de ses variables locales.
Quand une procedure se termine, ses variables locales n'existent plus, donc la mémoire où elles se trouvaient peut être réutilisée et modifiée, notamment par les variables d'autres fonctions:

Code : Tout sélectionner


Structure RESULTAT
  octet.b
  Mot.w
  motlong.l
  Chaine.s
EndStructure

Procedure MaProcedure()
  Result.RESULTAT
 
  Result\octet   = #True
  Result\Mot     = 1234
  Result\motlong = 12345678
  Result\Chaine  = "Hello World !"
  ProcedureReturn @Result
EndProcedure

Procedure metlesouk()
  a=7
  b=9
  c.f=0.1
  d$="coucou"
EndProcedure

*Valeur.RESULTAT = MaProcedure()
metlesouk()
Debug *Valeur\octet
Debug *Valeur\Mot
Debug *Valeur\motlong
Debug *Valeur\Chaine 
Par contre, une procedure peut prendre en paramètre un pointeur vers une structure à remplir:

Code : Tout sélectionner


Structure RESULTAT
  octet.b
  Mot.w
  motlong.l
  Chaine.s
EndStructure

Procedure MaProcedure(*result.resultat)
 
  *Result\octet   = #True
  *Result\Mot     = 1234
  *Result\motlong = 12345678
  *Result\Chaine  = "Hello World !"
  ;ProcedureReturn @Result  : du coup, plus besoin de retourner de valeur
EndProcedure

Procedure metlesouk()
  a=7
  b=9
  c.f=0.1
  d$="coucou"
EndProcedure

MaProcedure(@Valeur.RESULTAT)
metlesouk()
Debug Valeur\octet
Debug Valeur\Mot
Debug Valeur\motlong
Debug Valeur\Chaine 
Voilà :wink:

Publié : dim. 06/juin/2004 6:31
par Anonyme2
filperj a écrit :Ah non, :evil:
Une procédure ne doit jamais renvoyer un pointeur vers une de ses variables locales.
Quand une procedure se termine, ses variables locales n'existent plus, donc la mémoire où elles se trouvaient peut être réutilisée et modifiée, notamment par les variables d'autres fonctions:

Tu as 100% raison filperj

Publié : dim. 06/juin/2004 9:40
par Chris
Belle démonstration! . Il faut faire comme dit filperj. (Et ne jamais utiliser la procédure "metlesouk", elle fout un de ces bordel...!) :lol:

Ca montre aussi ce qui peut arriver quand on a que les codes des autres pour apprendre.

Bon, ben va encore falloir que je change ma façon de faire, moi !!! :wink:

Chris :)