Page 1 sur 1

Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 5:22
par bloiiing
Bonjour,

je fais ça:

Code : Tout sélectionner

Structure FileStruct
  nom.s
  taille.q
  attributs.l
  datemodif.l
EndStructure

Structure DirStruct
  nom.s
  datemodif.l
  datecreate.l
  List SousDossiers.DirStruct()
  List Files.FileStruct()
EndStructure

Global.Dirstruct parametre

Procedure Examine( parametre.DirStruct )

code

EndProcedure
et j'ai une syntax error à la ligne Procedure Examine( parametre.DirStruct ).

Pourtant dans la doc de Procédure c'est indiqué que c'est la bonne façon d'écrire.

Autre question: On ne peut pas avoir une structure comme valeur de retour d'une procédure. Alors comment fait-on pour avoir plusieurs paramètres de retour pour une procedure?

Merci d'avance.

Re: Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 6:53
par venom
Bonjour,

pourquoi Procedure Examine( parametre.DirStruct )
et pas Procedure Examine(DirStruct) ???? que viens faire paramètre ?






@++

Re: Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 10:01
par flaith
A première vue, je mettrais plutôt :

Code : Tout sélectionner

Procedure Examine(*parametre.DirStruct)
mais c'est vraiment à première vue :wink: (donc le global n'a rien à faire ici)

Re: Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 10:55
par bloiiing
Ca m'enlève l'erreur quand je met *parametre.DirStruct mais je ne comprend pas pourquoi... Car dans la doc c'est écrit qu'on peut le faire avec un parametre.l. Peut-être que c'est parce qu'il s'agit d'une structure?

En tout cas, merci de vos réponses. Ca m'a aidé.

Re: Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 11:00
par GeBonet
Bonjour,
Je ne sais pas si cela peut t'aider... Mais voici un bout de code qui fonctionne.

Il présente une Structure... La rend Globale et comme on le voit la structure étant globale,
pas besoin de la passer en paramètre

Il y a affichage dans la procédure ... Modification et affectation d'une variable interne "test"
qui est renvoyé elle à l'appelant dans "Reponse".

En principe tout cela existe sous forme d'exemples dans les "Tutos" organisé et présenté par Dobro. :lol:

Code : Tout sélectionner

; 
; LA structure de départ ....
;
Structure Machin	; Nom de la structure                                             Decallage |Octeds
  Nom.s		        ; Chaine (String)     Offset = 0                                              (4)
  Age.w           ; Un mots             Offset = 4  (4 bytes pour décrire Nom.s donc  0+4= 4 )| (2)
  RueEtNumero.s	  ; Une chaine          Offset = 6  (2 bytes pour Un.w          donc  4+2= 6 )| (4)
  CodePerso.Q     ; Un quad             Offset = 10 (4 bytes pour RueEtNumero   donc  6+4=10 )| (8)
  CodePostal.l    ; EntierLong          Offset = 18 (8 bytes pour un Quad       donc 10+8=18 )| (4)
  Localite.s	    ; Chaine (String)     Offset = 22 (4 Bytes pour un entier long ==> 18+4=22 )| (4) 
  Telephone.s     ; Chaine (String)     Offset = 26 (4 Bytes pour une chaine    donc 22+4=26 )| (8)
  SoldeCompte.d   ; Un double           Offset = 30 (4 Bytes pour une chaine    donc 26+4=30 )| (8)
EndStructure      ;------                                                              ------------
;                                                                       SizeOf(Mon.Machin)    |(38)
Global Mon.Machin

Procedure Examine()     ; Pas besoin de passer la structure qui est ici globale... 
  Debug "Dans procedure" 
  Debug "----------------"
  Debug Mon\Nom
  Debug Mon\Age.w   
  Debug Mon\CodePostal
  Debug "----------------"
  test+1
  Mon\CodePostal+1000
	ProcedureReturn test 
EndProcedure 
; ----------------------------------------
; Affectation des champs de la structure 
;
  Mon\Nom.s		        ="GeBonet Gerhard"  
  Mon\Age.w           =65                 
  Mon\RueEtNumero.s	  ="Rue de France,26" 
  Mon\CodePerso.Q     =3366898999922221   
  Mon\CodePostal.l    =4020               
  Mon\Localite.s	    ="Liège"            
  Mon\Telephone.s     ="3204-nn0 mm 66"     
  Mon\SoldeCompte.d   =1233650.3368        
; -----------------------------------------
  Reponse=Examine()    ; Appel de la procedure 
  Debug Reponse        ; et affiche le résultat 
  Debug Mon\CodePostal ; Code postal modifié ...
  Debug "-------------------"
;
  ; On peux aussi affecter comme suit...
  ; dans ce cas l'assistant d'encodage entre en fonction ...
  ;
  With Mon
    \Nom="Albert"
    \RueEtNumero="Rue des trois rois, 26"
    \Localite="Namur"
    \CodePostal=6000
  EndWith
  ; etc... 
  Debug Mon\Nom
  Debug Mon\Age.w   
  Debug Mon\CodePostal
  End
Voilà, voilà... (Mon solde de compte est un peu forcé) :wink:

Re: Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 13:02
par Backup
GeBonet a écrit : En principe tout cela existe sous forme d'exemples dans les "Tutos" organisé et présenté par Dobro. :lol:
ben ouai ! :roll: :lol:

Re: Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 16:12
par Cls
En fait quant tu fais ça

Code : Tout sélectionner

 Procedure Examine( parametre.DirStruct ) 
tu lui dis que tu vas lui passer une structure.
Mais quand tu fais ça

Code : Tout sélectionner

 Procedure Examine( *parametre.DirStruct ) 
tu lui dis que tu vas lui passer l'adresse d'une structure de type DirStruct, donc en fait un ".l (long)". Ce qui est écrit dans la doc.

La nuance est très importante car dans un cas tu lui passes une copie des données (ce qui est interdit dans ton cas) et dans l'autre tu lui passes une référence (le pointeur) sur ces données.

Re: Paramètres de procédure valeur de retour

Publié : jeu. 23/déc./2010 17:44
par boddhi
De mémoire, on ne peut pas passer une variable structurée comme argument dans une procédure
Il faut utiliser un pointeur comme dans l'exemple donné par flaith :
flaith a écrit :

Code : Tout sélectionner

Procedure Examine( *parametre.DirStruct )

Re: Paramètres de procédure valeur de retour

Publié : ven. 24/déc./2010 0:12
par bloiiing
Cls a écrit :En fait quant tu fais ça

Code : Tout sélectionner

 Procedure Examine( parametre.DirStruct ) 
tu lui dis que tu vas lui passer une structure.
Mais quand tu fais ça

Code : Tout sélectionner

 Procedure Examine( *parametre.DirStruct ) 
tu lui dis que tu vas lui passer l'adresse d'une structure de type DirStruct, donc en fait un ".l (long)". Ce qui est écrit dans la doc.
Bien vu! Je n'avais pas fait le rapprochement entre le type long et une adresse qui est aussi de type long d'après la doc (du moins en 32 bits).

Merci bien!

Re: Paramètres de procédure valeur de retour

Publié : ven. 24/déc./2010 0:15
par bloiiing
Dobro a écrit :
GeBonet a écrit : En principe tout cela existe sous forme d'exemples dans les "Tutos" organisé et présenté par Dobro. :lol:
ben ouai ! :roll: :lol:
OK, je vais me pencher plus profondément sur les tutos...

A+