Übergabe eines Mehrdimensionalen Arrays an eine Funktion

  • Ein freundliches Hallo an die Autoit- Gemeinde,

    Ich hätte da ein kleines Problem und zwar möchte ich diverse Werte in einem 2D-Array Speichern allerdings soll dies nicht geschehen wenn diese Werte schon drin stehen.

    Hier mal mein Code

    [autoit]


    #Include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    global $speicher[1][2]
    $i = 0
    Do
    If UBound($speicher,2)-1 <> '' Then
    $baosarraysearch = BaosArraySearch($speicher,'1','2')
    If $baosarraysearch = 0 Then
    $erweitern = UBound($speicher) + 1
    ReDim $speicher [$erweitern] [2]
    ConsoleWrite($erweitern & @CR)
    $speicher[$i][0] = 1
    $speicher[$i][1] = 2
    EndIf
    EndIf
    $i = $i + 1
    Until $i = 100
    _ArrayDisplay ($speicher)

    [/autoit][autoit][/autoit][autoit]

    Func BaosArraySearch(ByRef $array,$argument1,$arbument2)
    $i = 0
    $return = 0
    Do
    If $array[$i][0] = $argument1 Then
    If $array[$i][1] = $arbument2 Then
    $return = 1
    Return $return
    EndIf
    EndIf
    $i = $i + 1
    Until $i = UBound($array)-1
    EndFunc

    [/autoit]

    Wie ihr seht habe ich es vorgesehen dass da im $speicher[x][0] und $speicher[x][1] immer das selbe drin stehen wird um diese Funktion zu testen. Allerdings kommt bei mir beim ausführen immer der fehler "Array variable has incorrect number of subscripts or subscript dimension range exceeded."

    Ich möchte darauf hinweisen dass ich durchaus schon die Sufu genutzt habe aber die Antworten mir bei diesem Problem nicht wirklich weitergeholfen haben.

    Ich freue mich schon auf eure Antworten und danke schon mal im vorraus

    Pecadis

    2 Mal editiert, zuletzt von Pecadis (19. April 2011 um 11:40)

  • Herzlichen Dank für die schnelle antwort... immer solche flüchtigkeitsfehler -.-.. :D

  • so nach ein wenig rumbasteln und rumtun bin ich dennoch am verzweifeln .. woran es diesmal hapert .. ich habe keine ahnung.

    Hier mal der Code

    [autoit]


    #Include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    global $speicher[1][2]

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 to 100 Step 1
    If UBound($speicher,2)-1 <> '' Then
    $searchx = Random(1,651,1)
    $searchy = Random(1,1000,1)
    $diffminus = 2
    $diffplus = 2
    $baosarraysearch = BaosArraySearch($speicher,$searchx,$searchy,$diffminus,$diffplus)
    ConsoleWrite("Return:" & $baosarraysearch & @CR)
    If $baosarraysearch = 0 Then
    ConsoleWrite("Größe:" & UBound($speicher) & @CR)
    $erweitern = UBound($speicher) + 1
    ReDim $speicher[$erweitern][2]
    $speicher[$i][0] = $searchx
    $speicher[$i][1] = $searchy
    EndIf
    EndIf
    ;ConsoleWrite("Durchlauf:" & $i & @CR)
    Next
    _ArrayDisplay ($speicher)

    [/autoit][autoit][/autoit][autoit]

    Func BaosArraySearch($array,$argument1,$argument2,$diffminus,$diffplus)
    Local $return = 0
    For $i = 0 to UBound($array)-1
    If $array[$i][0] = $argument1 And between($array[$i][1],$diffminus,$diffplus) = 0 Then
    $return = 1
    EndIf
    Next
    Return $return
    EndFunc
    Func between($zahl,$min,$max)
    $return = 0 ; die zahl ist außerhalb der range
    If $zahl <= $zahl - $min And $zahl >= $zahl + $max Then
    $return = 1 ;die zahl ist innerhalb der range
    EndIf
    Return $return
    EndFunc

    [/autoit]

    Wenn es zur Problemlösung beihilft möchte ich noch sinn und zweck meines Programmabschnittes sagen.
    Ziel dieses Programmteils soll sein dass er in einem array x und y koordinaten eingibt aber wenn es diese x und y koordinate schon gibt soll es dieses überspringen (klappt soweit mehr oder weniger) der 2. teil ist noch dass wenn die x koordinate und das y element + - z.b. 2 schon im array steht dann soll er das auch ignorieren.

    nun bin ich am verzweifeln weil ich mir schon einen schönen plan aufgeschrieben habe wie es eigentlich funktionieren müsste und weiß aber nicht wo mein denkfehler ist.

    könntet ihr mir da bitte weiterhelfen?

  • Das sollte deinen Wünschen entsprechen...

    Spoiler anzeigen
    [autoit]

    Global $aTest[5][2] = [[5, 5], [5, 4], [6, 4], [4, 5], [1, 4]]

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("Result: " & BaosArraySearch($aTest, 5, 5, 1, 2) & @CRLF & "Index: " & @extended & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func BaosArraySearch($a_Search, $n_X_Element, $n_Y_Element, $n_Min, $n_Max)
    $i_Size = UBound($a_Search) - 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $i_Size
    If Not($a_Search[$i][0] >= $n_X_Element - $n_Min And $a_Search[$i][0] <= $n_X_Element + $n_Max) Or Not($a_Search[$i][1] >= $n_Y_Element - $n_Min And $a_Search[$i][1] <= $n_Y_Element + $n_Max) Then Return SetExtended($i, 1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return 0
    EndFunc

    [/autoit]
  • Also ich danke dir schon mal für den Code ... nur was macht er ? Also zumindest nicht das was ich mit ihm vor hatte ._.

  • Nun gut dann entschuldige ich mich mal für meine unverständliche art und weise ;)

    Dieser Programmteil bekommt später laufend neue x und y koordinaten (deswegen mein random bei $searchx und $searchy) und dieses programmteil soll die kommenden koordinaten in dem array speichern. Nun gibt es dafür aber ein paar bedingungen.

    Die Koordinaten dürfen nicht doppelt vorkommen also das pärchen 2, 19 darf nicht 2 oder mehrmals vorkommen.
    Die y koordinate darf nicht im bereich +-einer abweichung in zusammenhang mit der x koordinate vorhanden sein. Beispiel ich habe im array schon mal die koordinate 2,19 drin und meine abweichung ist jetzt mal 4 und nun kommt eine neue koordinate 2,20 und diese darf nicht eingetragen werden weil x die gleiche zahl ist Und 20 innerhalb von +-4 ausgehend von sich selber ist (also er soll schauen im im y bereich zwischen 16 und 24 schon was da ist) anders herum muss er aber die koordinate 3,20 eintragen weil 3 ja nicht 2 ist.

    Ich hoffe ich konnte mich so verständlich wie möglich ausdrücken .. tut mir leid :D aber manchmal verwirrt mich meine eigene aufgabenstellung wenn ichs mir nicht hinschreibe.

  • So müsste es aber stimmen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aMemory[1][2] = [[0]]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 100
    $iX_Rnd = Random(1, 10, 1)
    $iY_Rnd = Random(1, 20, 1)
    Switch BaosArraySearch($aMemory, $iX_Rnd, $iY_Rnd, 2, 2, 1)
    Case 1
    ConsoleWrite("Duplicate: " & @extended & " (Index)" & @CRLF _
    & "X=" & $aMemory[@extended][0] & "|" & $iX_Rnd & @CRLF _
    & "Y=" & $aMemory[@extended][1] & "|" & $iY_Rnd & @CRLF)
    Case 0
    $aMemory[0][0] += 1
    ReDim $aMemory[$aMemory[0][0] + 1][2]

    [/autoit] [autoit][/autoit] [autoit]

    $aMemory[$aMemory[0][0]][0] = $iX_Rnd
    $aMemory[$aMemory[0][0]][1] = $iY_Rnd
    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aMemory)

    [/autoit] [autoit][/autoit] [autoit]

    Func BaosArraySearch($a_Search, $n_X_Element, $n_Y_Element, $n_Min, $n_Max, $i_Start = 0, $i_End = -1)
    $i_Size = UBound($a_Search)
    If $i_End = -1 Then $i_End = $i_Size - 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i_1 = $i_Start To $i_End
    If $a_Search[$i_1][0] = $n_X_Element And $a_Search[$i_1][1] >= $n_Y_Element - $n_Min And $a_Search[$i_1][1] <= $n_Y_Element + $n_Max Then Return SetExtended($i_1, 1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return 0
    EndFunc

    [/autoit]
  • Wow danke sehr

    Ich verneige mich demütigst vor dir und spreche hiermit auch meinen herzlichsten dank an dich aus name22 =)