Procedure qui renvoit un tableau

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Procedure qui renvoit un tableau

Message 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
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Procedure qui renvoit un tableau

Message 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...
Ehma
Messages : 26
Inscription : dim. 24/juin/2018 19:01

Re: Procedure qui renvoit un tableau

Message 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
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Procedure qui renvoit un tableau

Message 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

:wink:
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Procedure qui renvoit un tableau

Message 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...
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Procedure qui renvoit un tableau

Message 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)
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Re: Procedure qui renvoit un tableau

Message par bombseb »

aaah oui ok
Par contre en faisant comme ca, tu ne dois pas oublier de libérer la mémoire
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Procedure qui renvoit un tableau

Message 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).
Image
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Procedure qui renvoit un tableau

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre