2D-Array > wie addiert man?

  • Hallo nochmal :)

    die Überschrift sagt es schon :)
    Mein Vorhaben ist, dass es beispielsweise 2 Input-Felder gibt, in die man eine Zahl eintragen kann.
    Die eingetragenen Werte sollen dann in $Wert von "$Zahl3 als Summe aus $Wert von $Zahl1 + $Zahl2 gespeichert werden....
    Ich dachte das wäre ganz banal....meine Idee:

    [autoit]


    $Array[$Zahl3][$Wert] = $Array[$Zahl1][$Wert] + $Array[$Zahl2][$Wert]

    [/autoit]


    ....funktioniert nur nicht.
    Wie macht man es richtig?
    Autoit berechnet zwar irgendwas, aber bei weitem nicht das was es soll...

    Schonmal danke für jeden Hinweis :)

  • Hast du die Input-Felder mit "GUICtrlRead()" ausgelesen? :rolleyes:

    Und probier mal das:

    [autoit]

    $Array[$Zahl3][$Wert] = Number($Array[$Zahl1][$Wert]) + Number($Array[$Zahl2][$Wert])

    [/autoit]

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ja das habe ich:

    [autoit]


    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 679, 399, 218, 129)

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

    $Input1 = GUICtrlCreateInput("", 168, 216, 121, 21)
    $Input7 = GUICtrlCreateInput("", 296, 216, 121, 21)

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

    $Button1 = GUICtrlCreateButton("Berechne!", 408, 272, 203, 49)

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

    GUISetState(@SW_SHOW)

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

    #EndRegion ### END Koda GUI section ###

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

    While True
    Switch GUIGetMsg()
    Case $Button1
    _Rechne()

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

    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _Rechne()

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

    Local $aiArray[2][2], $i
    Local $Zahl1, $Zahl2,$Zahl3, $Wert, $Id

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

    $aiArray [$Zahl1][$Id] = $Input1
    $aiArray [$Zahl2][$Id] = $Input7

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

    ; Werte speichern
    $aiArray[$Zahl1][$Wert] = Number(GUICtrlRead($Input1))
    $aiArray[$Zahl2][$Wert] = Number(GUICtrlRead($Input7))

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

    $aiArray[$Zahl3][$Wert] = Number($aiArray[$Zahl1][$Wert]) + Number($aiArray[$Zahl2][$Wert])

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

    MsgBox(1,"Ergebnis", "Ergebnis beträgt " & $aiArray[$Zahl3][$Wert] &" !")
    EndFunc

    [/autoit]

    Aber das ändert leider nichts.
    2 + 3 ergibt laut meiner Programmierung 6....und 4 + 8 =16
    hier ist irgendwas nicht wies sein soll....

  • Hi,
    Ich habe ehrlich gesagt keine Ahnung, was ein 2D Array damit zu tun hat, 2 Zahlen zu addieren....

    Zitat

    hier ist irgendwas nicht wies sein soll....

    yepp, der Kandidat erhält 100 Punkte!
    Schau dir mal an, welche Werte du zusammenzählst, das sind die ControlID´s der Input-Felder...

  • Tut mir leid aber ich kann weder aus deinem Quelltext noch aus deiner Erklärung erkennen was genau du tun willst.
    Deine Funktion ändert aber auf jeden fall immer nur den $aiArray[0][0] weil du keine initialisierung deiner variablen vornimmst.
    d.h. in zeile 34,35 und 37 schreibst du immer in $aiArray[0][0] und das kann ja wohl kaum sinn und Zweck sein.

    Kennst du dich mit Arrays aus?

  • Ich hätte das ja eher so gemacht (da du anscheinend nur Plus-Rechnen willst):

    [autoit]

    Func _Rechne()
    Local $iZahl1 = GUICtrlRead($Input1), $iZahl2 = GUICtrlRead($Input7)

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

    $iErgebnis = Number(Execute($iZahl1 & "+" & $iZahl2))
    ConsoleWrite("> Ergebnis: " & $iErgebnis & @LF)
    EndFunc

    [/autoit]

    (Ist auf die Schnelle im Browser getippt, daher keine Garatie, das ein korrektes Ergebnis herauskommt :P)

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ich kenn mich kein Stück aus^^ leider^^

    ...aber ich arbeite dran.

    aber danke schonmal für den Hinweis...so schwer kanns ja nu echt nicht sein :wacko:

    Schnitzel hat oben ein schönes TUT zu Arrays gepostet. das werd ich mir mal hernehmen.

  • Ich hatte mal aus Langeweile einen kleinen Taschenrechner geschrieben, vielleicht hilft dir das Skript ja. ;)

    Spoiler anzeigen
    [autoit]

    ; by PainTain

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

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Compression=3
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Res_Fileversion=1.0
    #AutoIt3Wrapper_Res_LegalCopyright=Made by PainTain
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
    #AutoIt3Wrapper_Run_Tidy=y
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #NoTrayIcon
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiEdit.au3>

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

    $hGUI = GUICreate("Calculator by PainTain", 434, 386, 214, 119)
    GUISetFont(8, 800, 0, "MS Sans Serif")
    $hTerm = GUICtrlCreateEdit("", 16, 16, 401, 37, $ES_READONLY);---BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUICtrlSetData(-1, "")
    GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
    $hNumNull = GUICtrlCreateButton("0", 16, 328, 91, 41)
    $hNumPoint = GUICtrlCreateButton(".", 120, 328, 91, 41)
    GUICtrlSetFont(-1, 20, 800, 0, "MS Sans Serif")
    $hResult = GUICtrlCreateButton("=", 224, 328, 91, 41)
    $hNumOne = GUICtrlCreateButton("1", 16, 272, 91, 41)
    $hNumTwo = GUICtrlCreateButton("2", 120, 272, 91, 41)
    $hNumThree = GUICtrlCreateButton("3", 224, 272, 91, 41)
    $hNumFour = GUICtrlCreateButton("4", 16, 216, 91, 41)
    $hNumFive = GUICtrlCreateButton("5", 120, 216, 91, 41)
    $hNumSix = GUICtrlCreateButton("6", 224, 216, 91, 41)
    $hNumSeven = GUICtrlCreateButton("7", 16, 160, 91, 41)
    $hNumEight = GUICtrlCreateButton("8", 120, 160, 91, 41)
    $hNumNine = GUICtrlCreateButton("9", 224, 160, 91, 41)
    $hResOutput = GUICtrlCreateEdit("", 16, 82, 324, 64, $SS_CENTER + $ES_READONLY)
    GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
    $hNumPlus = GUICtrlCreateButton("+", 328, 160, 91, 41)
    $hNumMinus = GUICtrlCreateButton("-", 328, 216, 91, 41)
    $hNumMulti = GUICtrlCreateButton("x", 328, 272, 91, 41)
    $hNumDivi = GUICtrlCreateButton("%", 328, 328, 91, 41)
    GUICtrlCreateLabel("Result:", 16, 64, 88, 17)
    $hClearAll = GUICtrlCreateButton("Clear All", 352, 120, 67, 25)
    $hBackspace = GUICtrlCreateButton("Back", 352, 80, 67, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hNumNull
    _GUICtrlEdit_AppendText($hTerm, "0")
    Case $hNumOne
    _GUICtrlEdit_AppendText($hTerm, "1")
    Case $hNumTwo
    _GUICtrlEdit_AppendText($hTerm, "2")
    Case $hNumThree
    _GUICtrlEdit_AppendText($hTerm, "3")
    Case $hNumFour
    _GUICtrlEdit_AppendText($hTerm, "4")
    Case $hNumFive
    _GUICtrlEdit_AppendText($hTerm, "5")
    Case $hNumSix
    _GUICtrlEdit_AppendText($hTerm, "6")
    Case $hNumSeven
    _GUICtrlEdit_AppendText($hTerm, "7")
    Case $hNumEight
    _GUICtrlEdit_AppendText($hTerm, "8")
    Case $hNumNine
    _GUICtrlEdit_AppendText($hTerm, "9")
    Case $hNumPoint
    _GUICtrlEdit_AppendText($hTerm, ".")
    Case $hNumPlus
    _GUICtrlEdit_AppendText($hTerm, "+")
    Case $hNumMinus
    _GUICtrlEdit_AppendText($hTerm, "-")
    Case $hNumMulti
    _GUICtrlEdit_AppendText($hTerm, "*")
    Case $hNumDivi
    _GUICtrlEdit_AppendText($hTerm, "%")
    Case $hClearAll
    GUICtrlSetData($hTerm, "")
    GUICtrlSetData($hResOutput, "")
    Case $hBackspace
    $fInputRead = GUICtrlRead($hTerm)
    $fInputBack = StringTrimRight($fInputRead, 1)
    GUICtrlSetData($hTerm, $fInputBack)
    ;~ If @error Then MsgBox(0, "Debug", "Error: " & @error)
    Case $hResult
    _CheckTerm()
    EndSwitch
    WEnd

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

    Func _CheckTerm()
    Local $fTermRead = GUICtrlRead($hTerm)

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

    If $fTermRead = "" Then
    MsgBox(0 + 64 + 4096, "Error", "Please insert a Term to calcute!")
    ElseIf StringLeft($fTermRead, 1) = "+" Or StringLeft($fTermRead, 1) = "-" Or StringLeft($fTermRead, 1) = "*" Or StringLeft($fTermRead, 1) = "%" Then
    MsgBox(0 + 64 + 4096, "Error", "Invalid Term!")
    ElseIf StringRight($fTermRead, 1) = "+" Or StringRight($fTermRead, 1) = "-" Or StringRight($fTermRead, 1) = "*" Or StringRight($fTermRead, 1) = "%" Then
    MsgBox(0 + 64 + 4096, "Error", "Invalid Term!")
    ElseIf StringLeft($fTermRead, 1) = "." Or StringRight($fTermRead, 1) = "." Or StringInStr($fTermRead, "..") Then
    MsgBox(0 + 64 + 4096, "Error", "Invalid Term!")
    ElseIf StringInStr($fTermRead, "+-") Or StringInStr($fTermRead, "+*") Or StringInStr($fTermRead, "+%") Or StringInStr($fTermRead, "++") Or StringInStr($fTermRead, "-+") Or StringInStr($fTermRead, "-*") Or StringInStr($fTermRead, "-%") Or StringInStr($fTermRead, "--") Then
    MsgBox(0 + 64 + 4096, "Error", "Invalid Term!")
    ElseIf StringInStr($fTermRead, "*+") Or StringInStr($fTermRead, "**") Or StringInStr($fTermRead, "*-") Or StringInStr($fTermRead, "*%") Or StringInStr($fTermRead, "%+") Or StringInStr($fTermRead, "%-") Or StringInStr($fTermRead, "%*") Or StringInStr($fTermRead, "%%") Then
    MsgBox(0 + 64 + 4096, "Error", "Invalid Term!")
    Else
    _CalculateTerm($fTermRead)
    EndIf
    EndFunc ;==>_CheckTerm

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

    Func _CalculateTerm($fTermRead)
    $fTermConv = StringReplace($fTermRead, "%", "/")
    ;~ ConsoleWrite($fTermConv & @CRLF)

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

    $fResult = Execute($fTermConv)

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

    ;~ ConsoleWrite(StringLen($fResult) & @CRLF)
    If StringLen($fResult) >= 18 Then
    GUICtrlSetData($hResOutput, _TrimResult($fResult))
    Else
    GUICtrlSetData($hResOutput, $fResult)
    EndIf
    EndFunc ;==>_CalculateTerm

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

    Func _TrimResult($fResult) ;Ich weiß, könnte man auch mit Round machen :P
    Local $i = 1

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

    Do
    $fResult = StringTrimRight($fResult, 1)
    $i += 1
    Until StringLen($fResult) = 18
    Return $fResult
    EndFunc ;==>_TrimResult

    [/autoit]


    Das hatte ich am ziemlich am Anfang geschrieben, wo ich mit AutoIt noch nicht so vertraut war.
    Also beschwert euch nicht, wenn ihr den Taschenrechner viel zu umständlich findet. :D

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Erstmal wie andy schon sagte, wozu brauchst du ein 2D Array zum addieren der Werte? Das würde bestenfalls Sinn machen, wenn du die Ergebnisse nach der Berechnung weiterverwenden willst. Da du das Array aber lokal deklarierst ist das Array danach ohnehin weg. Wenn du die Ergebnisse also speichern willst brauchst du ein globales Array, welches nur einmal am Scriptanfang deklariert wird und nicht bei jedem Funktionsaufruf erneut.

    Nun zum eigentlichen Fehler:

    [autoit]


    ;...
    $Input1 = GUICtrlCreateInput("", 168, 216, 121, 21)
    $Input7 = GUICtrlCreateInput("", 296, 216, 121, 21)
    ;...
    Func _Rechne()
    Local $aiArray[2][2], $i
    Local $Zahl1, $Zahl2,$Zahl3, $Wert, $Id

    [/autoit]

    Wir halten hier mal fest, dass du die Variablen $zahl1-3, $wert und $id nur deklarierst, sie haben alle keinen Wert, was als 0 interpretiert wird. Dein Array wird mit 2x2 Feldern deklariert, es besitzt also 2 Zeilen (0 und 1) und 2 Spalten (0 und 1).
    Ansprechen müsstest du das Array folglich so:

    [autoit]


    $aiArray[0][0]="Inhalt Spalte 1, Zeile 1"
    $aiArray[0][1]="Inhalt Spalte 2, Zeile 1"
    $aiArray[1][0]="Inhalt Spalte 1, Zeile 2"
    $aiArray[1][1]="Inhalt Spalte 2, Zeile 2"

    [/autoit]

    Jetzt machst du das hier:

    [autoit]


    $aiArray [$Zahl1][$Id] = $Input1
    $aiArray [$Zahl2][$Id] = $Input7

    [/autoit]

    Da $zahl1-2 und $id alle 0 sind änderst du zweimal hintereinander den Inhalt von $aiArray[0][0], die anderen 3 Datenfelder des Arrays sind leer.
    Richtig wäre also eher das:

    [autoit]


    $aiArray [0][0] = $Input1
    $aiArray [1][0] = $Input7

    [/autoit]

    Das sorgt dafür, dass beide Control IDs in der jeweils ersten Spalte gespeichert sind. Das so zu tun ist ggf. sinnvoll, aber wie anfangs erwähnt sollte das global passieren und zwar dann wenn du die Controls erstellst.

    [autoit]


    ; Werte speichern
    $aiArray[$Zahl1][$Wert] = Number(GUICtrlRead($Input1))
    $aiArray[$Zahl2][$Wert] = Number(GUICtrlRead($Input7))

    [/autoit]

    Hier haben deine Variablen $zahl1-2 und $wert immer noch den Wert 0, also änderst du erneut das Feld $aiArray[0][0] zweimal hintereinander, deine alten Werte existieren somit nicht mehr. Gehen wir mal davon aus, dass du es wie oben von mir vorgeschlagen machst, dann müsste das ganze so lauten:

    [autoit]


    $aiArray[0][1] = Number(GUICtrlRead($Input1))
    $aiArray[1][1] = Number(GUICtrlRead($Input7))

    [/autoit]

    Das sorgt nun dafür, dass du die Inhalte der beiden Textfelder in die 2. Spalte deines Arrays speicherst. Das fertige Array schaut nun so aus:

    Code
    Zeile1: ID Control1 | Inhalt von Control 1
    Zeile2: ID Control2 | Inhalt von Control 2

    Deine Rechnung:

    [autoit]


    $aiArray[$Zahl3][$Wert] = Number($aiArray[$Zahl1][$Wert]) + Number($aiArray[$Zahl2][$Wert])

    [/autoit]

    Der selbe Fehler wie schon die anderen Male, du verwendes die nicht gesetzten Variablen und sprichst daher immer das selbe Feld im Array an, du erhälst also immer das selbe Ergebnis. Konkret wird folgendes passieren, angenommen du gibst ins Textfeld 2 den Wert 100 ein, dann hast du nun im angesprochenen Array Feld den Wert 100 stehen, diesen liest du zweimal aus und erhälst die Summe 200, welche dann im selben Feld gespeichert wird. Der Inhalt von Textfeld 1 wird immer in der jeweils 2. Zeile überschrieben, somit ist er längst nicht mehr vorhanden. (siehe oben).

    Richtig wäre also, sofern du meine Änderungen befolgt hast:

    [autoit]


    $summe = $aiArray[0]1] + $aiArray[1]1]

    [/autoit]

    Da du garkeinen Platz mehr im Array hast kannst du diese Summe auch nirgendwo mehr speichern. Du müsstest wenn schon noch eine dritte Zeile ins Array packen in der das Ergebnis dann gespeichert werden kann.

    Nun nochmal zum Sinn oder Unsinn das alles mit einem Array zu machen:

    [autoit]


    Func _Rechne()
    $summe = number(guictrlread($input1))+number(guictrlread($input7))
    MsgBox(1,"Ergebnis", "Ergebnis beträgt " & $summe &" !")
    EndFunc

    [/autoit]

    Das würde völlig ausreichen. Die Nutzung von Arrays würde bestenfalls Sinn ergeben, wenn du sehr viele Controls hast die aufaddiert werden sollen oder eine nicht genau bestimmte Anzahl an Controls dynamisch erstellen musst.


    EDIT: Da hab ich wohl zulange getippt...

    Einmal editiert, zuletzt von misterspeed (4. Juni 2013 um 20:55)