Procedure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
aliong
Messages : 44
Inscription : lun. 12/avr./2010 22:17

Re: Procedure

Message par aliong »

en effet ! :p faut pas m'en vouloir j'ai parfois du mal :p
aliong
Messages : 44
Inscription : lun. 12/avr./2010 22:17

Re: Procedure

Message par aliong »

en faite encore une tite question si vous me le permettez ! :p
es ce possible de lire les valeur d'un tableau externe à la procédure dans la procédure ? en sachant que mon tableau est déclaré dans un autre fichier .pbi que j'include au début avant les procédures... je sais pas si j'ai été assé clair ! :p
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Procedure

Message par Cls »

Il suffit de déclarer ton tableau en global.

++
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Procedure

Message par Backup »

ou bien d'utiliser l'exemple que tu as toi meme trouvé dans la doc

passer un tableau en parametre d'une procedure :
en utilisant le mot 'Array'

Code : Tout sélectionner

Procedure fill(Array A.l(1), longueur)  ; Le 1 représente le nombre de dimensions du tableau
    For i = 0 To longueur
      A(i) = i
    Next i
  EndProcedure
 
  Dim A.l(10)
  fill(A(), 10)  ; Le tableau A() est passé en paramètre
 
  Debug A(5)
  Debug A(10)
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Procedure

Message par Cls »

Ah oui c'est vrai qu'on peut faire ça maintenant. Je n'ai pas programmé beaucoup en PB depuis ces évolutions qui sont très pratiques !
aliong
Messages : 44
Inscription : lun. 12/avr./2010 22:17

Re: Procedure

Message par aliong »

je sais pas si c'est du au faite que les tableaux soit dans un inclde mais en param ça ne passait pas justement... je vais ressayé j'ai du faire une erreur
merci sinon je testerai en global
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Procedure

Message par PAPIPP »

Bonjour Dobro et Bravo pour avoir trouvé la possibilité d'utiliser un tableau en externe et en interne d'une procédure
Mais le prg suivant montre que l'adresse de titi() a changé et que l'on peut revenir au tableau d'origine Prg principal
ou au tableau créé dans la procédure au choix de la programmation
Une seule variable pour deux espaces mémoire encore bravo pour avoir découvert cette possibilité

Code : Tout sélectionner

Procedure tonton(a,b)
  Dim titi(10,10)
  For y=1 To 10
    For x=1 To 10
      titi(x,y)=x*y
    Next x
  Next y
  ProcedureReturn @titi() ; en fait on retourne l'adresse du tableau local a la procedure
EndProcedure

Dim titi(10,10) ; on creer un tableau externe qui va recevoir le tableau interne
; Non ce tableau ne reçoit rien la mèmoire est toujours disponible Il y a substitution d'adresse mais si l'on sauve l'adresse 
; d'origine on retrouve sous le même nom de variable la table d'origine
; Voir le démo suivante
; Chargement de la première table titi
For l=0 To 10
  For c=0 To 10
    titi(l,c)=(l+10)*C
  Next
Next

AD_TITI_M=@titi()
titi()=tonton(a,b) ; on recupere le contenu du tableau de la proc
ad_titi_p=@titi()

Debug "adresse titi Prg Principal ="+Str(ad_titi_m)
Debug "adresse titi Procédure ="+Str(ad_titi_p)

Debug "Val titi(5,5) Procédure="+Str(titi(5,5)) ; affiche 25 car 5*5=25 meme que !
titi()=ad_titi_m
Debug "Val titi(5,5) Prg principal="+Str(titi(5,5)) ; affiche 75 car (5+10)*5= 75
titi()=ad_titi_p
Debug "Val titi(5,5) Procédure="+Str(titi(5,5)) ; affiche 25 car 5*5=25 meme que !
; On peut passer sous la même variable d'un espace mémoire à un autre s'ils ont la même structure
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Procedure

Message par Backup »

.............
Dernière modification par Backup le sam. 01/oct./2011 11:56, modifié 1 fois.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: Procedure

Message par Geo Trouvpatou »

Salut.

Ce type de conversation a aussi été évoquée ici.

Cela fonctionne bien si la taille des tableaux est bonne.
A la rigueur le tableau externe (Celui dans lequel on copie) peut-être supérieur, mais pas le contraire sinon de toute façon le compilo renvoie "Array index out of bounds"

Bref technique dangereuse mais fonctionnelle :lol:.

Bye.

[EDIT]Je m'auto-cite : "A la rigueur le tableau externe (Celui dans lequel on copie) peut-être supérieur."
J'ai un doute puisqu'en faisant :

Code : Tout sélectionner

EnableExplicit

Procedure tonton(a,b)
      Protected x.i, y.i
      Dim titi(10,10)
      For y=1 To 10
            For x=1 To 10
                  titi(x,y)=x*y
            Next x
      Next y
      ProcedureReturn @titi() ; en fait on retourne l'adresse du tableau local a la procedure
EndProcedure

Global a.i, b.i

Dim titi(14,14) ; on creer un tableau externe qui va recevoir le tableau interne
titi()=tonton(a,b) ; on recupere le contenu du tableau de la proc

Debug titi(5,5) ; affiche 25 car 5*5=25 meme que !
Je n'obtiens plus 25.

Autre exemple : avec ce petit code, cela fonctionne :

Code : Tout sélectionner

EnableExplicit

Procedure tonton(a)
      Protected x.i
      Dim titi(5)
      
      For x=1 To 5
            titi(x)=x
      Next x
      
      ProcedureReturn @titi() ; en fait on retourne l'adresse du tableau local a la procedure
EndProcedure

Global a.i, i.i
Debug tonton(a)

Dim titi(5) ; on creer un tableau externe qui va recevoir le tableau interne
titi()=tonton(a) ; on recupere le contenu du tableau de la proc

Debug "-----"
Debug titi()
Debug tonton(a)
Debug "-----"

Debug ""

Debug "-----"
For i= 0 To 5
      
      Debug str(@titi(i)) +" = "+ str(PeekI(@titi() + (i*SizeOf(integer))))
      
Next i
Debug "-----"

Debug ""

;Debug titi(4) 
Mais si j'augmente la valeur du tableau externe et en dessous la boucle qui va avec, j'ai un message d'erreur.
C'est peut-être moi qui me suis planté.

Code : Tout sélectionner

EnableExplicit

Procedure tonton(a)
      Protected x.i
      Dim titi(5)
      
      For x=1 To 5
            titi(x)=x
      Next x
      
      ProcedureReturn @titi() ; en fait on retourne l'adresse du tableau local a la procedure
EndProcedure

Global a.i, i.i
Debug tonton(a)

Dim titi(10) ; <-- On met 10
titi()=tonton(a) ; on recupere le contenu du tableau de la proc

Debug "-----"
Debug titi()
Debug tonton(a)
Debug "-----"

Debug ""

Debug "-----"
For i= 0 To 10 ; <-- On met 10
      
      Debug str(@titi(i)) +" = "+ str(PeekI(@titi() + (i*SizeOf(integer))))
      
Next i
Debug "-----"

Debug ""

;Debug titi(4) 
Donc cela reviendrait à dire qu'il faut que les tableaux soient RIGOUREUSEMENT identiques.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Procedure

Message par Backup »

Geo Trouvpatou a écrit : Donc cela reviendrait à dire qu'il faut que les tableaux soient RIGOUREUSEMENT identiques.
:) c'te bonne blague , il ne me serai meme pas venu a l'idée de faire un tableau diffèrent :)

le but etant de récuperer un tableau , vouloir changer sa structure en cours de route est un vice
que mon cerveau n'aurai jamais accepté :lol:

encore que Redim() devrai fonctionner pour un tableau 1 dimension :)
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: Procedure

Message par Geo Trouvpatou »

Dobro a écrit :
Geo Trouvpatou a écrit : Donc cela reviendrait à dire qu'il faut que les tableaux soient RIGOUREUSEMENT identiques.
:) c'te bonne blague , il ne me serai meme pas venu a l'idée de faire un tableau diffèrent :)

le but etant de récuperer un tableau , vouloir changer sa structure en cours de route est un vice
que mon cerveau n'aurai jamais accepté :lol:
Bah pourquoi pas, si le but était de récupérer les valeurs d'un tableau pour les mettre dans un plus grand pour ensuite y ajouter d'autres choses.
Mais là, ça devient assez dangereux et ça ressemble plus à du boubliboulga qu'à de la prog.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Procedure

Message par Backup »

Geo Trouvpatou a écrit : Bah pourquoi pas, si le but était de récupérer les valeurs d'un tableau pour les mettre dans un plus grand pour ensuite y ajouter d'autres choses.
Mais là, ça devient assez dangereux et ça ressemble plus à du boubliboulga qu'à de la prog.
je ne suis pas d'accord ! ; rien de "dangereux" la dedans

le but est de ressortir un tableau d'une procédure ... point !

si après tu veux changer le tableau pour augmenter sa taille , c'est un autre problème
mais qui n'as rien a voir avec le fait de récupérer un tableau d'une procédure ...
faut pas tout confondre ... ;)

tu aura ce problème de changement de taille avec n'importe quel tableau !
le fait qu'il provienne d'une procédure, n'as rien a voir ..
Répondre