Problem bei Telefonbuch-Skript

  • Hi,
    vorab:
    Ich habe selten ein Script gesehen, bei dem ein "Fehler" vom Programmierer erst in diesem Stadium auftaucht :S
    Wenn ich Scripte, dann binde ich reihenweise Debug-Informationen in Form von Kontrollen (Consolewrite, Msgboxen, ab und zu mal Traces usw. ) ein.
    So weiss ich jederzeit, nachdem ich auf F5 gehauen habe, was los ist und was mein Script macht / oder nicht macht.
    Ist richtig dimensioniert, stimmen die Variablen(inhalte), sind die Arrays richtig ausgefüllt? Wer diese grundlegenden Informationen in seinem Programm nicht kennt, aber fleissig hunderte Zeilen "drauflosprogrammiert", braucht sich im Nachhinein nicht zu wundern...
    Btw. ist das "Fehlersuchen" Sache des Programmierers! Wenn DIR "langweilig" ist, dann hast du genug Zeit, in DEINEM Script die von DIR verursachten Fehler zu finden und musst dir nicht hier im Forum andere deine Arbeit machen lassen!

    Nun zum "Problem":
    Woher weisst du, dass dein 3D-Array richtig ausgefüllt bzw. erstmal richtig dimensioniert ist?
    Die AutoIt-Funktionen geben ALLE im Fall der Fälle einen Fehlercode

    [autoit]

    @error

    [/autoit]

    zurück, im gesamten Script ist nicht ein einziger dieser Fehlercodes ausgewertet!

    [autoit]

    _arraydisplay()

    [/autoit]

    stellt nur bis 2D dar, soviel steht fest! Hast du ein "Anzeigetool" für 3D- bzw. mehrdimensionale Arrays? Ich hab eins...

    [autoit]

    ubound()

    [/autoit]

    hat einen 2. Parameter, welcher die Rückgabe der Größe der Dimensionierung beeinflusst!

    [autoit]

    _arraysearch()

    [/autoit]

    sucht auch nur in 2-dimensionalen Arrays.

  • Die Fehlermeldung sagt doch, wo das Problem ist: $entries[$i]
    Der Index $i überschreitet die Indexgröße des Arrays, liegt im Nirgendwo.


    Und wie kann das passieren? $i geht doch von 0 bis zum letzten Index.

    Andy Die Arrays sind alle richtig befüllt und sämtlicher anderer Kram ist auch getestet.

    • Offizieller Beitrag

    Und wie kann das passieren? $i geht doch von 0 bis zum letzten Index.


    Eben nicht, du adressierst ohne zu prüfen ob das Array existiert/diese Größe hat. Ich habe dein Skript nicht auseinandergepflückt. Aber glaub mir: Indexfehler sind reine schlampige Fehler. Auch wenn du meinst, das Array existiere in der Größe, solltest du das in der Verarbeitung prüfen und ein Error-Handling einbauen.

  • Da ich mich die ganze Zeit gefragt habe wie man darauf kam, dass das hier ein 3D Array sein soll und ichs nun auch endlich gesehn hab:

    [autoit]


    $key = _ArraySearch ($entries[$i], $categories[$i_1][1])
    If $key Then
    $val &= $entries[$i][$key][1]

    [/autoit]

    Was nun? Ist $entries ein 1D Array oder ein 3D Array? Da es in der oberen Zeile zum Absturz kommt wird es wohl mehr als eine Dimension haben und du sprichst das Array an dieser Stelle falsch an. Sofern es ein 3D Array ist siehe auch die Anmerkungen von meinen Vorpostern bezüglich Einschränkungen der maximalen Dimensionen für die meisten Array Funktionen.

    Einmal editiert, zuletzt von misterspeed (1. September 2013 um 11:19)

  • Hi,

    Zitat

    Andy Die Arrays sind alle richtig befüllt und sämtlicher anderer Kram ist auch getestet.

    naja, wenn alles andere getestet ist, dann liegt der "Fehler" bei AutoIt? :rofl:
    Was ist denn an diesen Zeilen

    [autoit]

    $key = _ArraySearch ($entries[$i], $categories[$i_1][1])
    If $key Then
    $val &= $entries[$i][$key][1]
    EndIf

    [/autoit]

    "getestet"? Schreib einfach einen validen Wert in die Variable $key und guck dir das Ergebnis an!

    [autoit]

    $key = $i_1 ;_ArraySearch ($entries[$i], $categories[$i_1][1])
    If $key Then
    $val &= $entries[$i][$key][1]
    EndIf

    [/autoit]

    keine Fehlermeldung, also liegt das "Problem" wohl in der Funktion _arraysearch() (wohl eher nicht ^^) oder in DEINEN Parametern!
    Mal abgesehen davon, dass es den "Parameter" $entries[$i] garnicht geben kann, da $entries[] 3-dimensional ist....

    //EDIT
    wenn für das Listview sowieso pipe-getrennte Strings verwendet werden, wieso nimmst du dieses Format nicht direkt für deine "Datenbank" als Textdatei?
    NAME|VORNAME|EMAIL|bla|blub

    Dann wäre das Lesen der Datei in einer Zeile erledigt, und das Füllen der Listview in 3 Zeilen.
    Die Suche wäre incl. Schleife in drei Zeilen erledigt...

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy (1. September 2013 um 11:58)

  • "teste" mal

    [autoit]

    $key = $i_1 ;_ArraySearch ($entries[$i], $categories[$i_1][1])
    ;~ If $key Then
    $val &= $entries[$i][$key][1]
    ;~ EndIf
    EndIf
    Next

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

    ; MsgBox (0, 0, $val)
    $item1 = GUICtrlCreateListViewItem($val, $ctrl_main[2])

    [/autoit]

    damit habe ich sämtliche Einträge aus einer erweiterten Datei dargestellt bekommen