Page 1 sur 1

procedure ...

Publié : mar. 09/févr./2010 11:26
par jerexgrz
Lorsqu'on declare des variables dans une procedure, les variables appartiennent à la procedure.

Code : Tout sélectionner

procedure examiner (a.l)
x1x.l
endprocedure

procedure analyser(b.l)
x1x.l
endprocedure
Maintenant, lorsque j'ajoute une structure, j'ai un message d'erreur => 'structure', 'interface', ... déjà déclaré.

Code : Tout sélectionner

Procedure examiner (a.l)
x1x.l

Structure type
  bx.l  
EndStructure

EndProcedure

Procedure analyser(b.l)
x1x.l

Structure type
  bx.l  
EndStructure

EndProcedure
Normalement, le fait d'avoir une structure à l'intérieur d'une procédure devrait avoir le meme comportement qu'une variable ?
Il y a peut etre une instruction à ajouter devant la structure pour qu'elle reste valide que dans la procedure.

Re: procedure ...

Publié : mar. 09/févr./2010 12:01
par Backup
a mon avis, une structure est toujours Global !

sinon comment pourrions nous récupérer le contenue d'une structure Windows ( du systeme d'exploitation ! ) , sans avoir a appeler une fonction API ???

je pense a ceci par exemple :

Code : Tout sélectionner

GetCursorPos_(Pos.POINT)
   
Debug Pos\x
Debug Pos\y
la logique voudrai dans ce cas qu'on recupere Pos.POINT en sortie de fonction...
ce n'est pas le cas ,
on appel ici une fonction , qui charge la structure , et on affiche la structure qui est bien global
sinon nous n'aurions aucune valeurs, puisqu'on est sorti de la procedure GetCursorPos_()

Re: procedure ...

Publié : mer. 10/févr./2010 14:14
par Ouaf-Ouaf
Il me semble avoir lu quelque part dans l'aide que les structures doivent être déclarées en dehors des procédures.

J'ai le vague souvenir de m'être déjà trouvé face à ce problème en convertissant les gosub d'un ancien programme en procédures. J'ai finalement opté pour des déclarations de structures en début de programme, comme en témoigne mes vieux .pb :P

Re: procedure ...

Publié : mer. 10/févr./2010 15:28
par djes
Une structure sert au compilateur à savoir comment réserver/aligner/traiter (je ne peux pas dire structurer!) les espaces mémoires. Comme PB est un compilateur "une passe", il ne parcourt qu'une fois le code source et compile à la volée; il est donc préférable qu'il sache dès le début ce genre de choses.
C'est un peu comme quand vous déclarez une variable en .w ou en .l, ça dit à PB comment il doit traiter la variable, et quel espace mémoire il doit lui réserver.

Re: procedure ...

Publié : ven. 12/févr./2010 22:23
par cederavic
Un structure n'est pas une variable, elle n'est pas allouée en memoire, elle est juste là a titre d'info comme le dit Djes (savoir quoi va ou et de quelle taille)
Il n'y a pas de structure global ou shared ou je ne sais quoi, elle ne peuvent pas etre definis dans un bloc de code (j'entends par là, Procedure, Datasection etc...) et doivent l'etre avant utilisation (comme les procedure, a la seule difference qu'il n'y a pas de Declare Structure).
C'est pas tout à fait correct Dobro, la structure POINT est bien définie dans PB, et l'api te demande seulement un pointeur pour le remplir... Tu peut tout aussi bien lui envoier un Double (qui prendre le meme espace memoire que le "Point") le resulta sera le meme :

Code : Tout sélectionner

GetCursorPos_(@Pos.d)
Debug PeekL(@Pos)
Debug PeekL(@Pos + 4)
GetCursorPos_(@Pos2.Point)
Debug Pos2\x
Debug Pos2\y
Ou tu peut meme te faire ta propre structure Point que t'appelera Mouzaba ça fonctionnera aussi (a condition qu'elle fasse la meme taille)