foreach-Schleife: aktuelles Listenelement überspringen
Moderator: Co-Administratoren
- jmaus
- Beiträge: 9865
- Registriert: 17.02.2015, 14:45
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Dresden
- Hat sich bedankt: 464 Mal
- Danksagung erhalten: 1883 Mal
- Kontaktdaten:
Re: foreach-Schleife: aktuelles Listenelement überspringen
All die Wünsche/Vorschläge mit „Listen“-Bearbeitung kann ich natürlich verstehen und nachvollziehen. Allerdings ist es so, das der Missbrauch des Tabularzeichens (\t) für die foreach abarbeitung mir noch nie zugesagt hat und es meines Erachtens besser einen richtigen Listendatentyo geben sollte statt hierfür nun diesen Tabulator-Missbrauch fortzusetzen. Weil wenn ich das jetzt auf die String Funktionen wie Contains(), Replace() etc erweitern würde dann gleiche das dem Öffnen der Büchse der Pandorra weil dann kommen diese Funktionen ja nicht mehr mit normalen strings klar in denen sich eben auch Tabulatoren befinden könnten. Also entweder müsste man für ein Contains() ein zweites ListContains() oder so einführen, oder besser man führt einen „list“ datentyp ein auf den man dann Contains() anwenden kann. Und ich tendiere zu letzterem auch wenn das wesentlich mehr aufwand wäre und somit auch wesentlich länger dauern würde.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal /
-
- Beiträge: 10660
- Registriert: 21.09.2012, 08:09
- System: CCU
- Wohnort: Stuttgart
- Hat sich bedankt: 321 Mal
- Danksagung erhalten: 501 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Wäre mir auch Recht.
Allerdings sollte die Kompatibilität zu alten Skripten bestehen bleiben, weil ansonsten eQ-3 das sicherlich nicht umsetzen würde.
Allerdings sollte die Kompatibilität zu alten Skripten bestehen bleiben, weil ansonsten eQ-3 das sicherlich nicht umsetzen würde.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
-
- Beiträge: 236
- Registriert: 02.10.2018, 19:24
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 59 Mal
- Danksagung erhalten: 11 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Hallo Ihr lieben script-Experten,
erstmal vielen Dank an alle für die Aufklärung hier bez. "break" und "continue". Funktioniert soweit.
jedoch bin ich grad über was seltsames gestolpert in meinen Scripten :Das wirft dir Fehlermeldung aus : Wenn ich hier das "While" (könnte auch "foreach" sein) auskommentiere, funktioniert das Skript.
Irgendwie vermute ich mal, dass bei geschachtelten Schleifen das break / continue eben nicht richtig für die jeweilige Ebene funktioniert.
jedenfalls war ich bei einem script mit so ca 500 Zeilen fast am Verzweifeln wegen Syntax-Error, daher hab ich ein einfaches Beispiel aufgesetzt und konnte es so nachvollziehen.
Ist das bei Euch auch so oder hab ich was übersehen? Bin für jeden Tipp dankbar
erstmal vielen Dank an alle für die Aufklärung hier bez. "break" und "continue". Funktioniert soweit.
jedoch bin ich grad über was seltsames gestolpert in meinen Scripten :
- innerhalb einer foreach-Schleife funktioniert sowohl "break" als auch "continue"
- hab ich innerhalb dieser Schleife eine weitere while- oder foreach-Schleife, geht hier auch noch break und continue
- nach Verlassen der inneren Schleife gehen in der äußeren dann aber KEINE break oder continue mehr
ich bekomme im SDV beim Test und beim Ausführen Fehlermeldungen
Code: Alles auswählen
string liste = "1,4,2,6,8,9,6,3,8,9";
string item;
foreach (item, liste.Split(",")) {
var i = 0;
while (i<10) { i=i+1; }
if (item.ToInteger() > 5) { continue; }
WriteLine(item);
}
Code: Alles auswählen
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: Error 1 at row 9 col 42 near ^; }^M ^M WriteLine(item);^M }^M ^M [SyntaxError():iseESP.cpp:1137]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: ; }^M ^M WriteLine(item);^M }^M [ParseProgram():iseESP.cpp:387]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: Error 1 at row 9 col 42 near ^; }^M ^M WriteLine(item);^M }^M ^M [SyntaxError():iseESP.cpp:1137]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: ; }^M ^M WriteLine(item);^M }^M [ParseProgram():iseESP.cpp:387]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: Error 1 at row 9 col 42 near ^; }^M ^M WriteLine(item);^M }^M ^M [SyntaxError():iseESP.cpp:1137]
Jun 13 22:02:18 HomeBox21 local0.err ReGaHss: ERROR: SyntaxError: ; }^M ^M WriteLine(item);^M }^M [ParseProgram():iseESP.cpp:387]
Irgendwie vermute ich mal, dass bei geschachtelten Schleifen das break / continue eben nicht richtig für die jeweilige Ebene funktioniert.
jedenfalls war ich bei einem script mit so ca 500 Zeilen fast am Verzweifeln wegen Syntax-Error, daher hab ich ein einfaches Beispiel aufgesetzt und konnte es so nachvollziehen.
Ist das bei Euch auch so oder hab ich was übersehen? Bin für jeden Tipp dankbar
Proxmox-MiniServer (J4125, 12GB RAM, nur SSDs, Proxmox 7.4-3), RM v3.69.7.20230506, abgesetztes, altes Funkmodul HM-MOD-RPI-PCB am RB-RF-ETH, ca. 5 HM- und 107 HMIP-Geräte, Addons : CUxD v2.10.1, eMail v1.7.6, XML-API v1.22, JB-HB v6.0, ProgrammeDrucken v2.6, CCU-Historian v3.3.1
Re: foreach-Schleife: aktuelles Listenelement überspringen
Kämpfe gerade mit dem selben Problem:
prinzipieller Programmauszug:
Hier erhalte ich eine Fehlermeldung.
Platziert man das Break aber direkt nach dem foreach (äußere Schleife): funktioniert es
Problem dabei ist dann nur, dass die Variable ELEMENT1 schon das nächste Listenelement enthält.
Blöd, wenn man damit weiter arbeiten will.
prinzipieller Programmauszug:
Code: Alles auswählen
GEFUNDEN = false;
foreach (ELEMENT1, LISTE1)
{ foreach (ELEMENT2, LISTE2)
{ if (AUSDRUCK1 == AUSDRUCK2)
{ GEFUNDEN = true;
break;
}
}
if (GEFUNDEN)
{ break; }
}
Platziert man das Break aber direkt nach dem foreach (äußere Schleife): funktioniert es
Code: Alles auswählen
GEFUNDEN = false;
foreach (ELEMENT1, LISTE1)
{ if (GEFUNDEN)
{ break; }
foreach (ELEMENT2, LISTE2)
{ if (AUSDRUCK1 == AUSDRUCK2)
{ GEFUNDEN = true;
break;
}
}
}
Blöd, wenn man damit weiter arbeiten will.
-
- Beiträge: 9681
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 700 Mal
- Danksagung erhalten: 1626 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Dann spring nicht mit break aus der Schleife, sondern bau die Logik um :
Mach aus
ein
Dann brauchst du kein break mehr. Die paar leeren schleifendurchläufe, die dann folgen sind zwar unschön, aber das verkraftet die CCU schon.
Mach aus
Code: Alles auswählen
if (GEFUNDEN)
{ break; }
Und das Element1 musst du halt woanders zwischen speichern.if (GEFUNDEN == false )
{.....
Dann brauchst du kein break mehr. Die paar leeren schleifendurchläufe, die dann folgen sind zwar unschön, aber das verkraftet die CCU schon.
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Re: foreach-Schleife: aktuelles Listenelement überspringen
Hi MichaelN
Es geht hier nur um das prinzipielle Problem, auf das g55 (und ich also auch) gestoßen ist.
Je nach Position des Abbruchbefehls "break" innerhalb der äußeren Schleife funktioniert es oder halt nicht!
Das sollte so nicht sein!
Natürlich kann man alles irgendwie zwischenspeichern und verdrehen / verbiegen. Das ist aber alles nicht nötig, wenn das mit dem Abbruchbefehl bei jeder Positionierung in der äußeren Schleife funktioniert. Das ist auf jeden Fall die bessere Lösung.
Und die "paar" Leerdurchläufe mehr, verursachen einen Laufzeitunterschied von 4-5 Sekunden in meinem Script (im Editor / Testmodus) ...
Es geht hier nur um das prinzipielle Problem, auf das g55 (und ich also auch) gestoßen ist.
Je nach Position des Abbruchbefehls "break" innerhalb der äußeren Schleife funktioniert es oder halt nicht!
Das sollte so nicht sein!
Natürlich kann man alles irgendwie zwischenspeichern und verdrehen / verbiegen. Das ist aber alles nicht nötig, wenn das mit dem Abbruchbefehl bei jeder Positionierung in der äußeren Schleife funktioniert. Das ist auf jeden Fall die bessere Lösung.
Und die "paar" Leerdurchläufe mehr, verursachen einen Laufzeitunterschied von 4-5 Sekunden in meinem Script (im Editor / Testmodus) ...
-
- Beiträge: 9681
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 700 Mal
- Danksagung erhalten: 1626 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Dann als Fehler auf Github melden. Ansonsten wird da wenig passieren.
LG, Michael.
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.
Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++
- jmaus
- Beiträge: 9865
- Registriert: 17.02.2015, 14:45
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Dresden
- Hat sich bedankt: 464 Mal
- Danksagung erhalten: 1883 Mal
- Kontaktdaten:
Re: foreach-Schleife: aktuelles Listenelement überspringen
Genau so sehe ich das auch! Nur was auf GitHub gemeldet ist existiert mehr oder weniger in meiner Erinnerung. Und so ist es auch mit diesem Problem. Denn erst jetzt hab ich mich gerade wieder an diesen Beitrag erinnert und hatte das problem mit break leider schon wieder total vergessen gehabt... Also bitte ein entsprechendes GitHub Ticket dazu aufmachen - bitte aber nicht einfach als einfache referenz/link hier her, sondern komplett unabgängig ausführen und mit entsprechenden lauffähigen Code Beispielen (nicht einfach nur pseudo-code) hinterlegen, etc. Nur so kann ich das dann in einer ruhigen Minute mal angehen und ggf reparieren.
Achja, und wenn ein solches Problem mit „break“ existiert sollte Das selbe auch prinzipiell mit „continue“ passieren. Das könntet ihr ja auch mal freundlicherweise testen.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal /
Re: foreach-Schleife: aktuelles Listenelement überspringen
Hallo Jens,
Hab dir 'nen "Merkzettel" geschriebenGenau so sehe ich das auch! Nur was auf GitHub gemeldet ist existiert mehr oder weniger in meiner Erinnerung.
-
- Beiträge: 236
- Registriert: 02.10.2018, 19:24
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 59 Mal
- Danksagung erhalten: 11 Mal
Re: foreach-Schleife: aktuelles Listenelement überspringen
Hatte ich in meinem Post weiter zurück eigentlich schon erwähnt : in meinem Testscript und anderen Tests betrifft es sowohl "break" wie auch "continue".
Proxmox-MiniServer (J4125, 12GB RAM, nur SSDs, Proxmox 7.4-3), RM v3.69.7.20230506, abgesetztes, altes Funkmodul HM-MOD-RPI-PCB am RB-RF-ETH, ca. 5 HM- und 107 HMIP-Geräte, Addons : CUxD v2.10.1, eMail v1.7.6, XML-API v1.22, JB-HB v6.0, ProgrammeDrucken v2.6, CCU-Historian v3.3.1