Variablen Namen verändern?

  • Hallo,
    ich wollte die Koordinaten von Kästchen in einem karierten Bereich raus bekommen.
    Ich frage den User nach dem 1.Kästchen dem links davon und dem darunter (6 Kästchen pro Reihe).
    Dann habe ich diese Funktion geschrieben und ich weiß aber nicht wie ich den Namen der Variable zu z.B. $ary_square4 bekomme.
    Mit $x wird die Nummer des Kästchens angegeben und diese soll dann an $ary_square angehängt werden.
    Kann mir da vlt jemand helfen?

    [autoit]


    Func getposition($x)
    $r = 1

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

    If $x>6 Then
    $x = $x-6
    $r = $r+1
    If $x>6 Then
    $x = $x-6
    $r = $r+1
    If $x>6 Then
    $x = $x-6
    $r = $r+1
    EndIf
    EndIf
    EndIf

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

    $ary_square+"$x"[0] = $ary_square1[0] + $x*$ary_squarediff[0]
    $ary_square+$x[1] = $ary_square1[1] - $r*$ary_squarediff[1]

    Return $ary_square+"$x"[0], $ary_square+$x[1]
    EndFunc

    [/autoit]

    Mfg Matze

    2 Mal editiert, zuletzt von matzebond (21. Oktober 2010 um 16:22) aus folgendem Grund: zum besseren Verständnis

  • Du kannst übrigens nicht den Namen einer Variable mir Return zurückgeben, nur deren Wert.

    Mach es doch so

    [autoit]

    Func getposition($x)
    Local $r = 1

    Do
    $x -= 6
    $r += 1
    Until $x <= 6

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

    $ary_square[0] = $ary_square1[0] + $x * $ary_squarediff[0]
    $ary_square[1] = $ary_square1[1] - $r * $ary_squarediff[1]

    Return $ary_square
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von m-obi (18. Oktober 2010 um 06:48)

  • stayawayknight
    Die Funktion Eval() hat mich auf die Funtion Assign() geführt.
    Habe erst gedacht mit der geht es aber irgendwie dann doch nicht. (siehe nicht funktionierender Quellcode)

    @m-obi
    Habe es mit Assign() nicht geschafft und dann es so gemacht wie du mir Return doch dadurch wird mein Quellcode viel länger siehe positions() in den verschiedenen Skripten.
    Das mit der Do Until Funktion würde meiner Meinung nach nur Funktionieren wenn man noch eine If-Abfrage davor setzt weil sonst $x negativ sein kann.

    Funktionierender Quellcode
    Die Funktion positions() ist sehr lange und es werden alle Positionen errechnet und nicht nur die, die benötigt werden.

    Spoiler anzeigen
    [autoit]

    Func positions()

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

    $ary_squarediff[0] = $ary_square2[0] - $ary_square1[0]
    $ary_squarediff[1] = $ary_square1[1] - $ary_square7[1]

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

    $ary_square3 = getposition(3)
    $ary_square4 = getposition(4)
    $ary_square5 = getposition(5)
    $ary_square6 = getposition(6)
    $ary_square8 = getposition(8)
    $ary_square9 = getposition(9)
    $ary_square10 = getposition(10)
    $ary_square11 = getposition(11)
    $ary_square12 = getposition(12)
    $ary_square13 = getposition(13)
    $ary_square14 = getposition(14)
    $ary_square15 = getposition(15)
    $ary_square16 = getposition(16)
    $ary_square17 = getposition(17)
    $ary_square18 = getposition(18)
    $ary_square19 = getposition(19)
    $ary_square20 = getposition(20)
    $ary_square21 = getposition(21)
    $ary_square22 = getposition(22)
    $ary_square23 = getposition(23)
    $ary_square24 = getposition(24)
    EndFunc ;==>positions

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

    Func getposition($x)
    Local $r = 0, $y[2]

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

    If $x > 6 Then
    $x = $x - 6
    $r = $r + 1
    If $x > 6 Then
    $x = $x - 6
    $r = $r + 1
    If $x > 6 Then
    $x = $x - 6
    $r = $r + 1
    EndIf
    EndIf
    EndIf

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

    $y[0] = $ary_square1[0] + ($x-1) * $ary_squarediff[0]
    $y[1] = $ary_square1[1] - $r * $ary_squarediff[1]
    Return $y
    EndFunc ;==>getposition

    [/autoit]

    Nicht funktionierender Quellcode
    Die Funktion positions() kurz und es werden nur Positionen errechnet, die benötigt werden.

    Spoiler anzeigen
    [autoit]

    Func positions()

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

    $ary_squarediff[0] = $ary_square2[0] - $ary_square1[0]
    $ary_squarediff[1] = $ary_square1[1] - $ary_square7[1]

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

    For $i = 2 To $square_input ;max 24
    getposition($i)
    Next
    EndFunc ;==>positions

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

    Func getposition($x)
    Local $r = 0

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

    If $x > 6 Then
    $x = $x - 6
    $r = $r + 1
    If $x > 6 Then
    $x = $x - 6
    $r = $r + 1
    If $x > 6 Then
    $x = $x - 6
    $r = $r + 1
    EndIf
    EndIf
    EndIf

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

    Assign("ary_square" + $x, $ary_square1[0] + ($x-1) * $ary_squarediff[0])
    Assign("ary_square" + $x, $ary_square1[1] - $r * $ary_squarediff[1])
    EndFunc ;==>getposition

    [/autoit]

    Also wenn irgendwer noch weiß die doch den 2. Quelltext verwirklichen kann dann lasst es mich wissen.

    Danke Matze

    EDIT:
    Habe grad bemerkt das in Assign() kein Array geschrieben habe und das das laut der Hilfe auch nicht möglich ist.
    Ich bräuchte also eine ähnliche Funktion wie Assign() die auch ein Array akzeptiert.

    Matze

  • Mach einen mehrdimensionalen Array indem Feldname und Position zuordnest.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi,
    hat nen bissen gedauert, weil ich erst doch nicht ganz verstanden habe und es viel komplizierten machen wollte
    doch gestern Abend hats Klick gemacht :)

    Allerdings muss MouseGetPos jetzt so aussehen.

    [autoit]

    $ary_square[1][0] = MouseGetPos(0)
    $ary_square[1][1] = MouseGetPos(1)

    [/autoit]


    weil er mir bei

    [autoit]

    $ary_square[1] = MouseGetPos()

    [/autoit]

    immer nen Fehler aus gibt

    Fertige Funktionen

    Spoiler anzeigen
    [autoit]

    Func positions()

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

    $ary_squarediff[0] = $ary_square[2][0] - $ary_square[1][0]
    $ary_squarediff[1] = $ary_square[7][1] - $ary_square[1][1]

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

    For $i = 2 To $numbersquars
    getposition($i)
    Next
    EndFunc ;==>positions

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

    Func getposition($x)
    Local $r = 0

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

    If $x > 6 Then
    $x -= 6
    $r += 1
    If $x > 6 Then
    $x -= 6
    $r += 1
    If $x > 6 Then
    $x -= 6
    $r += 1
    EndIf
    EndIf
    EndIf

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

    $ary_square[$x][0] = $ary_square[1][0] + $x * $ary_squarediff[0]
    $ary_square[$x][0] = $ary_square[1][1] - $r * $ary_squarediff[1]
    EndFunc ;==>getposition

    [/autoit]

    Noch eine Frage habe gelesen, dass je länger der Name des Arrays ist desto länger mehr Rechenleistung braucht Autoit stimmt das und mach das viel aus, wenn ich
    $ary_square[1][0] in $sq[1][0] oder so um benenne ??

    Danke an alle
    Matze

  • Nee wo haste denn das gelesen??? :rofl:
    Kommt eher auf die Länge der Funktion an.


    Wahrscheinlich in einem Buch oder Tutorial. Ist ja auch nichts falsches dran - AutoIt ist ne Interpretersprache. Der Quellcode wird also immer wieder durchgerattert - längere Variablen- und Funktionsnamen sorgen für mehr Text, was im Endeffekt eine langsamere Auswertung des Codes zur folge hat.

    Das ganze bewegt sich aber in einem Rahmen, wo es nicht sonderlich auffällt.
    Ich würde glatt mal behaupten, dass ich noch nie auf sowas geachtet habe, und im Normalfall ist es egal ob das Script für eine Funktion 20 ms oder 20,05 ms braucht.

  • Jup im Prinzip hatte derjenige Recht der das geschrieben hat. Aber das ganze bewegt sich wahrscheinlich in einem Bereich von < 0,1 % Unterschied.
    Wie auch SEuBo hab ich noch nie darauf geachtet. Verständliche Variablennamen sind mir in diesem Fall wichtiger als der minimale Performanceunterschied.

  • Ich hab ja auch nicht gemeint das z.B. $MGP genauso lange dauert wie $MouseGetPos. Nur in dem Bereich wo sich das bewegt ist es vernachlässigbar, da benötigt die Maus schon mehr Rechenleistung bei einer Bewegung, als die Differenz zwischen der Rechenleistung von $MGP und $MouseGetPos. Das ist wie schon gesagt im ns-Bereich.