Main forum > Bug Reports

Fehler in doppel-FOREACH schleifen

(1/2) > >>

sheepchen:
Hi. Ich hab einen Fehler in FOREACH gefunden. Es geht um folgendes. Ich habe 2 Arrays die ich miteinander vergleiche. Wenn ein wert von Array1 mit einem wert von Array2 übereinstimmt soll er BEIDE einträge aus den Arrays löschen. Wenn wer für das problem eine Lösung hat wärs schön wenn er diese posten würde.

Ich hab das Problem mal abstrahiert. hier ist es:


--- Code: (glbasic) ---GLOBAL array_1[]
GLOBAL array_2[]

REDIM array_1[3]
REDIM array_2[3]

array_1[0] = 10
array_1[1] = 11
array_1[2] = 12
array_2[0] = 20
array_2[1] = 12 // gleicher wert wie array_1[2] um eine übereinstimmung zu haben
array_2[2] = 22

main:
GOSUB show

FOREACH arr1 IN array_1[]
FOREACH arr2 IN array_2[]
IF arr1 = arr2  // übereinstimmung gefunden
DELETE arr1 // error : wrong argument type : Must be: arr2
DELETE arr2
END IF
NEXT
NEXT

GOSUB show
END // main

SUB show:
FOR i = 0 TO 1
PRINT array_1[i], 32*i, 10  // ausgabe  der beiden arrays
PRINT array_2[i], 32*i, 26 // (nur die ersten beiden werte)
NEXT
SHOWSCREEN
MOUSEWAIT
ENDSUB
--- End code ---

Quentin:
ich glaube aber eher, daß ist kein Fehler, sondern so gewollt. DELETE funktioniert meines Wissens nach nur innerhalb einer FOREACH .. NEXT - Schleife. D.h. innerhalb der zweiten FOREACH-Schleife ist "arr1" nicht bekannt.
Du müsstest dir in diesem Fall behelfen, indem du für die erste Scheife einen Zähler für den aktuellen Index mitlaufen lässt. In der zweiten Schleife kannst du dann mit DIMDEL gezielt auf den Eintrag aus dem ersten Array zugreifen.

Verwirrung komplett? ;)

sheepchen:
das war meine notlösung, aber ich dachte es gibt nen besseren weg :P

aber arr1 ist bekannt. also der vergleich funktioniert! Nur das löschen geht nicht :(

aber trozdem danke ;)

BumbleBee:
Ohne es zu testen ist mir gleich eins aufgefallen. Was ist dieses END IF eigentlich in der Schleife? :D Das sind zwei Befehle. Da kriegst du nämlich gleich noch ne Fehlermeldung. Wenn dann ENDIF. Na denn viel Spass noch mit GLBasic.:)

Cheers

Baggi:
Hi sheepchen,

Quentin hat recht. Du könntest es auch mit einem Schalter k  machen: k wird bei übereinstimmung in der inneren schleife 1 gesetzt. In der äußeren wird dann, wenn k=1 ist, der eintrag arr1 gelöscht.


--- Code: (glbasic) ---GLOBAL array_1[]
GLOBAL array_2[]

REDIM array_1[3]
REDIM array_2[3]

array_1[0] = 12
array_1[1] = 10
array_1[2] = 11
array_2[0] = 20
array_2[1] = 12 // gleicher wert wie array_1[0] um eine übereinstimmung zu haben
array_2[2] = 22

GLOBAL k=0

main:
    //GOSUB show

    FOREACH arr1 IN array_1[]
        FOREACH arr2 IN array_2[]
            IF arr1 = arr2  // übereinstimmung gefunden
            k=1
            DELETE arr2
            ENDIF
        NEXT
        IF k=1
        k=0
        DELETE arr1
        ENDIF
    NEXT

    GOSUB show
END // main

SUB show:
    FOR i = 0 TO 1
        PRINT array_1[i], 32*i, 10  // ausgabe  der beiden arrays
        PRINT array_2[i], 32*i, 26 // (nur die ersten beiden werte)
    NEXT
    SHOWSCREEN
    MOUSEWAIT
ENDSUB
--- End code ---

Navigation

[0] Message Index

[#] Next page

Go to full version