Return Array

Just starting out? Need help? Post your questions and find answers here.
coder14
Enthusiast
Enthusiast
Posts: 327
Joined: Tue Jun 21, 2011 10:39 am

Return Array

Post by coder14 »

Is it possible to return an array from a procedure maybe by its pointer?
fryquez
Enthusiast
Enthusiast
Posts: 391
Joined: Mon Dec 21, 2015 8:12 pm

Re: Return Array

Post by fryquez »

It can be done with a Structure.

Code: Select all

EnableExplicit

Structure BuildArrayHelper
  Array _array.s(1)
EndStructure

Procedure BuildArray()
  Protected *Array.BuildArrayHelper
  
  *Array = AllocateMemory(SizeOf(BuildArrayHelper))
  InitializeStructure(*Array, BuildArrayHelper)
  
  ReDim *Array\_array(6)
  
  *Array\_array(0) = "Hello"
  *Array\_array(1) = "I'am"
  *Array\_array(2) = "an"
  *Array\_array(3) = "Array"
  *Array\_array(4) = "returned"
  *Array\_array(5) = "from"
  *Array\_array(6) = "Procedure"
  
  ProcedureReturn *Array
EndProcedure

Define *Array.BuildArrayHelper = BuildArray(), x

For x = 0 To ArraySize(*Array\_array())
  Debug *Array\_array(x)
Next

;free Memory if no longer needed
ClearStructure(*Array, BuildArrayHelper)
User avatar
mk-soft
Always Here
Always Here
Posts: 6202
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Return Array

Post by mk-soft »

A clean method is to pass an array byref

Code: Select all

Procedure InitData(Array data1(1))
  Protected i
  
  ReDim data1(10)
  For i = 0 To 10
    data1(i) = i + 1000
  Next
  ProcedureReturn ArraySize(data1())
  
EndProcedure

Global Dim MyData(0)

Debug InitData(MyData())
For i = 0 To 10
  Debug MyData(i)
Next
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
Bisonte
Addict
Addict
Posts: 1305
Joined: Tue Oct 09, 2007 2:15 am

Re: Return Array

Post by Bisonte »

mk-soft wrote:A clean method is to pass an array byref
And the same with Maps() and Lists() !
PureBasic 6.21 (Windows x64) | Windows 11 Pro | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
English is not my native language... (I often use DeepL.)
coder14
Enthusiast
Enthusiast
Posts: 327
Joined: Tue Jun 21, 2011 10:39 am

Re: Return Array

Post by coder14 »

Sorry guys - I need to RETURN an array. So far only the structure seems to work although I prefer to not use structures. Can it be done with maps or lists maybe?
Fred
Administrator
Administrator
Posts: 18161
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: Return Array

Post by Fred »

You can allocate a memory buffer of the array size and copy all the elements in it
coder14
Enthusiast
Enthusiast
Posts: 327
Joined: Tue Jun 21, 2011 10:39 am

Re: Return Array

Post by coder14 »

Fred wrote:You can allocate a memory buffer of the array size and copy all the elements in it
Thanks Fred. I'm not quite sure how to do that but I'm trying. :D
User avatar
Bisonte
Addict
Addict
Posts: 1305
Joined: Tue Oct 09, 2007 2:15 am

Re: Return Array

Post by Bisonte »

This is a variant :

Code: Select all

Structure struct_array
  a.i
  b.s
EndStructure

Dim arr_struct.struct_array(9)

;: Fill Arrays
For i=0 To 9
  arr_struct(i)\a = Random(100,1)
  arr_struct(i)\b = Str(i)
Next i

Procedure GetOneStructArray(Array arr_struct.struct_array(1), Number.s = "3")
  
  Protected i, Result = 0
  
  For i=0 To 9
    If arr_struct(i)\b = Number
      Result = @arr_struct(i)
      Break
    EndIf
  Next i
  
  ProcedureReturn Result
  
EndProcedure

Original = @arr_struct(3)
fromProc = GetOneStructArray(arr_struct(), "3")

*Single.struct_array
*Single = fromProc

Debug Original
Debug fromProc
Debug "Result : "
Debug *Single\b
PureBasic 6.21 (Windows x64) | Windows 11 Pro | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
English is not my native language... (I often use DeepL.)
Post Reply