Liste füllt sich ungewollt

  • Liste füllt sich ungewollt

    Nabend,
    Könnte sich jemand mal ansehen was hier falsch ist? Das Problem ist folgendes:
    wen ich key_right benutze wird eine neue liste erstellt und in eine andere gepackt, was auch wunderbar funktioniert. leider wird die letzte liste immer mit allen zahle bis zur aktuellen Listen anzahl gefüllt. also wen ich 5 listen habe steht in der letzten 1 2 3 4 5. wen ich dann aber zurückblättere in die 4te, ist diese nicht mehr mit 1 2 3 4 gefüllt so wie es vorher war, sondern nur mit nullen.
    ich hätte gerne das jede neue liste nur aus 0en besteht.
    hier der Code:

    GML-Quellcode

    1. //create:
    2. calcList = ds_list_create();
    3. calc = ds_list_create();
    4. ds_list_add(calcList,calc);
    5. // position der calculation
    6. pos = 0;
    7. // ds_list_add(calc,15);
    8. //draw:
    9. list = ds_list_find_value(calcList,pos);
    10. for (i=0; i<16; i+=1) {
    11. line = ds_list_find_value(list,i);
    12. draw_text(x,y+(i+1)*16,line);
    13. }
    14. draw_text(16,16,pos);
    15. //key_press_right:
    16. pos += 1;
    17. if ( ds_list_size(calcList) < pos ) {
    18. calc = ds_list_create();
    19. ds_list_add(calcList,calc);
    20. }
    21. //key_presed_left:
    22. if ( pos > 0 ) {
    23. pos -= 1;
    24. }
    Alles anzeigen

    PS: der Fehler kann nur hier liegen, da das der gesamte Code der gml Datei ist, es existiertnur dieses Objekt, und dieser Code.
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • Das Problem liegt an

    GML-Quellcode

    1. if ( ds_list_size(calcList) < pos )

    Beim ersten Eintrag ist die Größe der Liste 1, da ja ein Eintrag drin ist. Pos ist aber 0. Drückt man nun die rechts Taste, wird pos um 1 erhöht aber kein neuer Eintrag angelegt, weil ja 1 < 1 falsch ist. Das hat zur Folge, das beim Auslesen der Zahl an der Stelle in der Liste calcList 0 steht, was der Index der calcList selbst ist. Erst ab pos 1 funktioniert das, weil dann wieder um 1 erhöht wird, 1 < 2 wahr ist und der Eintrag angelegt wird.
    Nun hat die Liste zwei Einträge, aber pos ist auf Stelle 3. Du zeichnest den dritten Wert. Da es aber nur zwei Werte gibt ist der dritte Wert 0. Und das ist der Index der calcList. Du zeichnest im Draw Event also nicht eine deiner Unterlisten sondern die Listen-Liste.

    Um dieses Problem der Ungleichheit deines pos und der Größe der Liste korrekt zusammen zu bringen und zu lösen musst du beim Vergleich der Position und der Größe den Wert der Position um 1 erhöhen. Die Abfrage sieht dann also so aus

    GML-Quellcode

    1. if ( ds_list_size(calcList) < pos+1 )


    Ist ein rein logisches Problem, was öfter mal beim Programmieren vorkommt.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum