Page 2 sur 2

Re: Procedure

Publié : jeu. 29/avr./2010 11:16
par aliong
en effet ! :p faut pas m'en vouloir j'ai parfois du mal :p

Re: Procedure

Publié : jeu. 29/avr./2010 22:02
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

Re: Procedure

Publié : jeu. 29/avr./2010 22:11
par Cls
Il suffit de déclarer ton tableau en global.

++

Re: Procedure

Publié : jeu. 29/avr./2010 22:13
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)

Re: Procedure

Publié : jeu. 29/avr./2010 22:18
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 !

Re: Procedure

Publié : jeu. 29/avr./2010 23:14
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

Re: Procedure

Publié : lun. 03/mai/2010 9:29
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+

Re: Procedure

Publié : lun. 03/mai/2010 9:50
par Backup
.............

Re: Procedure

Publié : lun. 03/mai/2010 16:08
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.

Re: Procedure

Publié : lun. 03/mai/2010 17:44
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 :)

Re: Procedure

Publié : mar. 04/mai/2010 16:30
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.

Re: Procedure

Publié : mar. 04/mai/2010 17:07
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 ..