Problem

  • Also. Habe mir diesen "Vokabeltrainer" mit hilfe aus dem anderen Thread gebastelt. Funktioniert auch teilweise ganz gut, jedoch tritt Manchmal der fehler

    \Desktop\test.au3 (49) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    If GUICtrlRead($input) = $voc[2] Then
    If GUICtrlRead($input) = ^ ERROR

    auf. Ich weiss nicht wodran es liegt :(

    hier Einmal der Quelltext:

    Spoiler anzeigen
    [autoit]

    ;includes
    #include "file.au3"
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    ;include Ende

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

    ;Variablen
    Dim $arvocs
    Dim $allvocs
    Dim $voc
    ;Variablen Ende

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

    ;Vokabeln auslesen
    _FileReadToArray (@scriptdir & "\Vokabeln.txt", $arvocs)
    $allvocs = UBound ($arvocs)
    ;Vokabeln auslesen Ende

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

    ;ToolTip
    $random = Random (1, $allvocs, 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    ;~ ToolTip ($voc[1], 500, 500)
    ;ToolTip Ende

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

    ;GUI
    $Form1 = GUICreate("Vokabeltester", 100, 90, 300, 10)
    $label = GUICtrlCreateLabel($voc[1],0, 10,90,20,$SS_CENTER)
    $input = GUICtrlCreateInput ("" , 10, 30, 80, 20)
    $ok = GUICtrlCreateButton ("OK", 40, 60)
    GUISetState (@sw_show)
    ;Gui Ende

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

    ;Warten aufs ausfüllen
    While 1
    $bla = GUIGetMsg()
    switch $bla
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ok
    _next()
    EndSwitch
    WEnd
    ;Warten Ende

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

    ;Schleife, die die nächste Vokabel erstellt
    Func _next()
    GUISetState (@SW_hide)
    If GUICtrlRead($input) = $voc[2] Then
    MsgBox (64, "Richtig", "Richtige Antwort.")
    Else
    MsgBox (64, "Falsch", $voc[2] & " wäre die richtige Lösung gewesen")
    ;~ ToolTip ("Richtig ist: " & $voc[2], 500, 500,"","",2)
    EndIf
    GUICtrlSetData ($input, "")
    ;~ Sleep (2000)
    $arvocs[$random] = ""
    $random = Random (1, $allvocs, 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    If $voc[1] = "" Then
    _next()
    EndIf
    GUICtrlSetData ($label, $voc[1])
    ;~ ToolTip ($voc[1], 500, 500,"","",2)
    GUISetState (@SW_show)
    EndFunc
    ;Schleife Ende

    [/autoit]

    und hier die dazugehörige text datei (muss Vokabeln.txt heißen)

    Spoiler anzeigen

    Hallo;hello
    rennen;run
    gehen;walk
    schauen;look
    lügen;lie
    kauen;chew
    drehen;turn
    lippen;lips
    augen;eyes

    hoffe es weiss jemand, wo der fehler liegt. Danke

    mfg SiLenCa

    Einmal editiert, zuletzt von SiLenCa (11. März 2009 um 13:05)

  • Die Meldung krieg ich auch oft. Hab den Code zwar noch net gelesen, aber kleiner Tipp:

    UBound zählt die Elemente eines Arrays.

    a[0] = "bla"
    a[1] = "bla"
    a[2] = "bla"

    UBound(a) = 3

    Man beginnt in der Informatik aber bei 0 an zu zählen. ;)

    Also zB.
    For i = 0 To UBound(a)-1
    ; Code
    Next

    ;)

  • Edit:: Also, hatte das ganz falsch verstanden, und du mich glaube ich auch ;) in meinem script soll der array nicht hochgezählt werden... es soll random die vokabeln aus der Textdatei auslesen und In die Gui (und als msg (lösung) ) eingefügt werden. Ich probiere hier ganze zeit rum aber verstehe nicht, warum es manchmal 10 mal funktioniert und manchmal auch nur 1 mal -.-

    Einmal editiert, zuletzt von SiLenCa (10. März 2009 um 20:42)

  • Naja, habe jetzt in der Funktion _next was geändert. Das führt dazu, das es immer nur 9mal klappt(Keine Ahnung warum 9mal... voc[0] sind zwar genau 9 aber warum ist nach 9x random voc[1] &/ voc[2] = " " ???

    Spoiler anzeigen
    [autoit]

    ;includes
    #include "file.au3"
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    ;include Ende

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

    ;Variablen
    Dim $arvocs
    Dim $allvocs
    Dim $voc
    ;Variablen Ende

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

    ;Vokabeln auslesen
    _FileReadToArray (@scriptdir & "\Vokabeln.txt", $arvocs)
    $allvocs = UBound ($arvocs)
    ;Vokabeln auslesen Ende

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

    ;ToolTip
    $random = Random (1, $arvocs[0], 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    ;~ ToolTip ($voc[1], 500, 500)
    ;ToolTip Ende

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

    ;GUI
    $Form1 = GUICreate("Vokabeltester", 100, 90, 300, 10)
    $label = GUICtrlCreateLabel($voc[1],0, 10,90,20,$SS_CENTER)
    $input = GUICtrlCreateInput ("" , 10, 30, 80, 20)
    $ok = GUICtrlCreateButton ("OK", 40, 60)
    GUISetState (@sw_show)
    ;Gui Ende

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

    ;Warten aufs ausfüllen
    While 1
    $bla = GUIGetMsg()
    switch $bla
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ok
    _next()
    EndSwitch
    WEnd
    ;Warten Ende

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

    ;Schleife, die die nächste Vokabel erstellt
    Func _next()
    GUISetState (@SW_hide)
    If GUICtrlRead($input) = $voc[2] Then
    MsgBox (64, "Richtig", "Richtige Antwort.")
    Else
    MsgBox (64, "Falsch", $voc[2] & " wäre die richtige Lösung gewesen")
    ;~ ToolTip ("Richtig ist: " & $voc[2], 500, 500,"","",2)
    EndIf
    GUICtrlSetData ($input, "")
    ;~ Sleep (2000)
    $arvocs[$random] = ""
    $random = Random (1, $arvocs[0], 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    While 1
    If $voc[1] = "" Then
    $arvocs[$random] = ""
    $random = Random (1, $arvocs[0], 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    Else
    ExitLoop
    EndIf
    WEnd
    GUICtrlSetData ($label, $voc[1])
    ;~ ToolTip ($voc[1], 500, 500,"","",2)
    GUISetState (@SW_show)
    EndFunc
    ;Schleife Ende

    [/autoit]

    Edit:: Problem gelöst lol ... Zeile 57 muss weg ($arvocs[$random] = "").

    • Offizieller Beitrag

    Zeile 16 brauchst du auch nicht , da du $arvocs[0] benutzt.
    Edit ich find Zeile 57 gut, dann werden die Volkabeln nicht wiederholt. Und das es damit nur 9 mal klappt ist doch klar, wenn du nur 9 Vokabeln in deinem Text hast .

  • So, ok danke Raupi. lasse zeile 57 drin ist so, wie ich es wollte. Ausserdem wollte ich eine funktion adden, dass alle falsch beantworten vokabeln so oft drankommen, bis sie richtig sind. Habe dazu FileWriteLine benutzt, aber komme nicht weiter, dass er wenn er fertig ist, dann die falschen nochmal dran nimmt.

    • Offizieller Beitrag

    Dann benutze $arvocs[$random] = "" nur wenn die Antwort richtig ist und schon mußt du kein neue Funktion schreiben :D

  • Entweder bin ich zu dumm oda irgentwas stimmt da net ;) wenn ich das nur mache, wenn es richtig ist, dann kommt nach jeder falschen antwort direkt die gleiche frage nochmal.... das soll ja nicht sinn der sache sein ;) es soll wenn alle vokabeln durchgefragt sind (9 in diesem fall) erst dann die ganzen falschen nochmal gefragt werden

    Edit:: Problem gelöst ;) Danke Raupi, hattest recht hab mich nur ein bisschen zu Dumm angestellt und dich falsch verstanden;) hier der Code der Funktioniert.

    Spoiler anzeigen
    [autoit]

    ;includes
    #include "file.au3"
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    ;include Ende

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

    ;Variablen
    Dim $arvocs
    Dim $allvocs
    Dim $voc
    ;Variablen Ende

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

    ;Vokabeln auslesen
    _FileReadToArray (@scriptdir & "\Vokabeln.txt", $arvocs)
    $allvocs = UBound ($arvocs)
    ;Vokabeln auslesen Ende

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

    ;Random
    $random = Random (1, $arvocs[0], 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    ;Random Ende

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

    ;GUI
    $Form1 = GUICreate("Vokabeltester", 100, 90, 300, 10)
    $label = GUICtrlCreateLabel($voc[1],0, 10,90,20,$SS_CENTER)
    $input = GUICtrlCreateInput ("" , 10, 30, 80, 20)
    $ok = GUICtrlCreateButton ("OK", 40, 60)
    GUISetState (@sw_show)
    ;Gui Ende

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

    ;Warten aufs ausfüllen
    While 1
    $bla = GUIGetMsg()
    switch $bla
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ok
    _next()
    EndSwitch
    WEnd
    ;Warten Ende

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

    ;Schleife, die die nächste Vokabel erstellt
    Func _next()
    GUISetState (@SW_hide)
    If GUICtrlRead($input) = $voc[2] Then
    MsgBox (64, "Richtig", "Richtige Antwort.")
    $arvocs[$random] = ""
    $random = Random (1, $arvocs[0], 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    Else
    MsgBox (64, "Falsch", $voc[2] & " wäre die richtige Lösung gewesen")
    $random = Random (1, $arvocs[0], 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    EndIf
    GUICtrlSetData ($input, "")
    While 1
    If $voc[1] = "" Then
    $arvocs[$random] = ""
    $random = Random (1, $arvocs[0], 1)
    $voc = $arvocs[$random]
    $voc = StringSplit ($voc, ";")
    Else
    ExitLoop
    EndIf
    WEnd
    GUICtrlSetData ($label, $voc[1])
    ;~ ToolTip ($voc[1], 500, 500,"","",2)
    GUISetState (@SW_show)
    EndFunc
    ;Schleife Ende

    [/autoit]

    Einmal editiert, zuletzt von SiLenCa (10. März 2009 um 23:21)