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:
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
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? ;)
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 ;)
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
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.
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
Hi! also 1. @BumbleBee jaja.. alte gewohnheit, sorry XD
2. Es geht immernoch nicht..
Hier nochmal der Hauptblock mit fehlermeldung:
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
Nö. Kein Fehler hier:
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.
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 ;)
achja, hiermit gebe ich bescheit das das mit der aktuellen version (v5) ohne probleme funktioniert. Ein dank an alle die hierrauf geantwortet hatten.