Sign in to follow this  
Followers 0
Smorg

Returning an array from a user func.

6 posts in this topic

Sorry, the manual is a bit unclear & i can't find an example of this anywhere...

Say i just want to return the result of a function as a couple of array keys:

msgbox(0, Blub[0] & Blub[1])

Func blub()
$crapa = "yay"
$crapb = "kewl"

Return $crapa;insert stuff to make it 2 array vars
Return $crapb
EndFunc

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Dim $MyVar = MyFunc()
MsgBox(0, "", $MyVar[0] & " " & $MyVar[1])
Exit

Func MyFunc()
  Local $Var[2]

  $Var[0] = "Hello"
  $Var[1] = "World"

  Return $Var
EndFunc

What you basically do is create an array in your function then return it. Quite simple actually.

Edited by Emperor

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

ah i see, thank you :-D

yeah it was just this confusing sentence: "Arrays can be passed to functions (and returned from them) by simply using the array name without any brackets. Note that function declarations cannot appear inside other function declarations."

Edited by Smorg

Share this post


Link to post
Share on other sites

...or use ByRef:

Global $MyVar[2]
MyFunc($MyVar)
MsgBox(0, "", $MyVar[0] & " " & $MyVar[1])
Exit

Func MyFunc(ByRef $MyVar)
  $MyVar[0] = "Hello"
  $MyVar[1] = "World"
EndFunc


[size="1"][font="Arial"].[u].[/u][/font][/size]

Share this post


Link to post
Share on other sites

I added comments for my late example

; Declare and assign the array
Global $array[2]
$array[0] = 1
$array[1] = 2

; execute function to pass an array
$return = _function($array)

; Show returned results
If IsArray($return) Then
    For $i = 0 To UBound($return) -1
        MsgBox(0, $i, $return[$i])
    Next
EndIf

; ByRef will prevent a copy of the array being made for function use.
Func _function(ByRef $parameter)
    Return $parameter
EndFunc

:D

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

yay works... good examples. This is what I was trying to do: (part of a very big include, returns nearest pixel color to an origin, rather than standard linear pixel search, centered over the middle of that color mass.)

;==========================================
;Radial pixel searching algorhythm ~Smorg
;Will perform a circular search pattern from an oragin ($x,$y)
;Returns 0 if none present, else 1 for success.
;==========================================
Func PixelFocusB()
;------------------User Variables----------------
$Radius = 1             ;starting radius from the scan oragin
$x = 400                      ;search origin
$y = 300                      ;search origin
;------------------------------------------------
Dim $XYBlock[2]
Dim $MaxRadius[4]
Dim $FinalCoord[2]
Dim $Corner = 0
Dim $Pixel = 0

$MaxRadius[0] = Sqrt(($x-$windowXmin)^2 + ($y-$windowYmin)^2);origin to upper left
$MaxRadius[1] = Sqrt(($x-$windowXmax)^2 + ($y-$windowYmin)^2);origin to upper right
$MaxRadius[2] = Sqrt(($x-$windowXmin)^2 + ($y-$windowYmax)^2);origin to lower left
$MaxRadius[3] = Sqrt(($x-$windowXmax)^2 + ($y-$windowYmax)^2);origin to lower right
$Corner = _ArrayMaxIndex($MaxRadius, 1, 0)

Do
  For $PiCount = 0 to (3.1415926*2) step $Resolution*((3.1415926*2)/(($Radius*2)*3.1415926))
  $XYBlock[0] = Round($x + ($Radius * (cos($PiCount))))
  $XYBlock[1] = Round($y + ($Radius * (sin($PiCount))))
    If $XYBlock[0] > $windowXmin AND $XYBlock[0] < $windowXmax AND $XYBlock[1] > $windowYmin AND $XYBlock[1] < $windowYmax Then
    $Pixel = pixelgetcolor($XYBlock[0], $XYBlock[1])
      For $MC = 1 to $MonstersColor[0]
        If $Pixel = $MonstersColor[$MC] Then
        Dim $XYBlock = MonsterCenter($XYBlock[0], $XYBlock[1], $MC)
        MouseMove($XYBlock[0], $XYBlock[1], $D2_FastIntMDelay)
        Return 1
        EndIf
      Next
    EndIf
  Next
  $Radius = $Radius + $Resolution
Until $Radius > $MaxRadius[$Corner]
Return 0
EndFunc

;==========================================================
;Will center the mouse over a selected block ~Smorg
;Final coordinates are returned as $XYBlock[0] & [1]
;==========================================================
Func MonsterCenter($x, $y, $color)
$CenteringResolution = 2      ;The resolution to use when scanning for the middle of the monster block
For $Left = $x to $windowXmin Step -($CenteringResolution)
$pixel = pixelgetcolor($Left, $y) 
If $pixel <> $MonstersColor[$color] Then ExitLoop
Next

For $Right = $x to $windowXmax Step $CenteringResolution
$pixel = pixelgetcolor($Right, $y)
If $pixel <> $MonstersColor[$color] Then ExitLoop
Next

For $Top = $y to $windowYmin Step -($CenteringResolution)
$pixel = pixelgetcolor($x, $Top)
If $pixel <> $MonstersColor[$color] Then ExitLoop
Next

For $Bottom = $y to $windowYmax Step $CenteringResolution
$pixel = pixelgetcolor($x, $Bottom)
If $pixel <> $MonstersColor[$color] Then ExitLoop
Next

$XYBlock[0] = $Left + (($Right - $Left)/2)
$XYBlock[1] = $Top + (($Bottom - $Top)/2)
Return $XYBlock
EndFunc
Edited by Smorg

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0