Fehler in doppel-FOREACH schleifen

Previous topic - Next topic

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) Select
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

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
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

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) Select
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

sheepchen

Hi! also 1. @BumbleBee jaja.. alte gewohnheit, sorry XD

2. Es geht immernoch nicht..
Hier nochmal der Hauptblock mit fehlermeldung:
Code (glbasic) Select
   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 // error : wrong argument type : Must be: arr2
            ENDIF
    NEXT

Kitty Hello

Nö. Kein Fehler hier:
Code (glbasic) Select
DIM array_1[100]
DIM array_2[100]

    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 // error : wrong argument type : Must be: arr2
            ENDIF
    NEXT
Aber: achtung: Der DELETE macht gleichzeitig ein CONTINUE!
Besser: Den Index für arr1 mirzählen und mit DIMDEL vor dem DELETE rauswerfen.

sheepchen

Also ich hab version 4.0.9.4 und da meckert er bei dem Block. Aber ich werd mir gleich mal die neue laden und es da testen. Wegen dem Continue, das ist in dem programm wo ich das problem habe kein problem. Da ist das sogar gewünscht das er bei einer übereinstimmung sovort mit dem nächsten element weitermacht. Aber danke für den hinweiss ;)

sheepchen

achja, hiermit gebe ich bescheit das das mit der aktuellen version (v5) ohne probleme funktioniert. Ein dank an alle die hierrauf geantwortet hatten.