Page 1 sur 1
Procedure qui renvoit un tableau
Publié : sam. 14/juil./2018 17:14
par bombseb
Bonjour les copains,
J'aimerai faire une procédure qui prend en paramètre une chaine de caractère et qui renvoi un tableau (array).
J'aimerais que mon tableau de variable soit dimensionné dans la procédure pour que je puisse faire un truc comme ca :
monTableau = maProc (a$)
Je pense que je suis obligé de passer par un pointeur alors j'ai fait ca :
Code : Tout sélectionner
Structure tileData
tile.u
EndStructure
Procedure ConvertDatas (tileDatas$)
n = CountString (tileDatas$, ",")
n + 1
Dim tab.tileData (n)
For i = 0 To n - 1
tab (i)\tile = 44 ; Je remplis mon tableau avec n'importe quoi (juste pour tester)
Next
ProcedureReturn @tab
EndProcedure
*toto = ConvertDatas ("a,b,c,d,e,f,g,h")
; Comment faire pour accéder aux élément de *toto ?
Merci pour votre aide
Re: Procedure qui renvoit un tableau
Publié : sam. 14/juil./2018 17:31
par bombseb
Bon je crois que j'ai peut être trouvé ma réponse ici :
https://www.purebasic.fr/english/viewtopic.php?t=67223
Il faut que je teste...
Re: Procedure qui renvoit un tableau
Publié : mar. 17/juil./2018 8:13
par Ehma
Bonjour,
Je ne sais pas si tu as trouvé, mais tu déclares une variable localement, immédiatement à la sortie de cette procédure, cette variable n'existe plus. Tu retournes donc un pointeur sur un tableau dont le contenu devient très rapidement incertain. J'ai souvent rencontré ce problème en Delphi
Re: Procedure qui renvoit un tableau
Publié : mar. 17/juil./2018 9:26
par Marc56
"Think simple"
Tu peux déclarer une variable globale (donc un tableau) dans une procédure.
Elle n'existera donc ainsi que si la procédure est exécutée
Après tu libères le tableau si tu n'en a plus besoin
Code : Tout sélectionner
Structure tileData
tile.u
EndStructure
Procedure ConvertDatas (tileDatas$)
n = CountString (tileDatas$, ",")
n + 1
Global Dim tab.tileData (n) ; <---------- Global Dim
For i = 0 To n - 1
tab (i)\tile = 44 ; Je remplis mon tableau avec n'importe quoi (juste pour tester)
Next
; ProcedureReturn @tab
; Mieux vaut utiliser ProcedureReturn pour un flag OK/KO
EndProcedure
; *toto = ConvertDatas ("a,b,c,d,e,f,g,h")
ConvertDatas ("a,b,c,d,e,f,g,h")
; Comment faire pour accéder aux élément de *toto ?
Debug tab(1)\tile
FreeArray(tab()) ; <-------- Plus besoin ? alors on jette

Re: Procedure qui renvoit un tableau
Publié : mar. 17/juil./2018 20:27
par bombseb
Merci pour vos réponses...
Ah oui pas con le coup du global dim dans la procédure...j'y avais pas pensé...
Bon du coup j'ai fait autrement...
Re: Procedure qui renvoit un tableau
Publié : mer. 18/juil./2018 1:38
par poshu
J'arrive après la guerre, mais voilà une solution pour retourner un objet complexe depuis une procédure:
Code : Tout sélectionner
Structure ReturnArray
Array montableau.i(0,0)
EndStructure
Procedure testouille()
Protected *result.ReturnArray = AllocateMemory(SizeOf(ReturnArray))
Dim *result\montableau(5,5) ; <- soit on Dim, soit on InitializeStructure(*result,ReturnArray).
*result\montableau(3,4) = 45
ProcedureReturn *result
EndProcedure
*data.ReturnArray = testouille()
Debug *data\montableau(3,4)
Re: Procedure qui renvoit un tableau
Publié : mer. 18/juil./2018 9:03
par bombseb
aaah oui ok
Par contre en faisant comme ca, tu ne dois pas oublier de libérer la mémoire
Re: Procedure qui renvoit un tableau
Publié : dim. 09/sept./2018 19:33
par Flype
A mon sens,
Global dans une procédure, ca devrait être proscrit
Autant le mettre directement dans l'entête du code (ce qui est sa place).
Re: Procedure qui renvoit un tableau
Publié : lun. 10/sept./2018 1:36
par microdevweb
Voici une solution, du moins si j'ai bien compris ta question.
Code : Tout sélectionner
Global Dim myTab.s(10)
Procedure addToTab(value.s,Array tb.s(1))
Protected i
; on parcour tous le tableau à la recherche
; du la première place vide
For i = 0 To ArraySize(tb()) - 1
; si la place est vide
If Not Len(tb(i))
tb(i) = value
Break ; on sort de la boucle
EndIf
Next
EndProcedure
addToTab("teste 1 ",myTab())
addToTab("teste 2 ",myTab())
addToTab("teste 3 ",myTab())
addToTab("teste 4 ",myTab())
For i = 0 To ArraySize(myTab()) - 1
Debug myTab(i)
Next
Et ton code modifié
Code : Tout sélectionner
Structure tileData
tile.u
EndStructure
Procedure ConvertDatas (tileDatas$,Array tab.tileData(1))
n = CountString (tileDatas$, ",")
n + 1
ReDim tab(n)
For i = 0 To n - 1
tab (i)\tile = 44 ; Je remplis mon tableau avec n'importe quoi (juste pour tester)
Next
EndProcedure
Dim toto.tileData(0)
ConvertDatas ("a,b,c,d,e,f,g,h",toto())
For i = 0 To ArraySize(toto())
Debug toto(i)
Next