TIA Mehrere Array Index werte vergleichen.

TIA_Ben

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
ich bin derzeit im Einstieg in SCL und suche nun eine Lösung für folgende Sache. Ich habe mehrere Array (1-50) und möchte diese durchgehend auf einen Wert vergleichen mit welchem ich dann eine visuelle Anzeige schalte.

Nun hab ich mir zunächst eine FOR Schleife gemacht, aber die scheint für den Einsatz nicht gerade ideal zu sein.

Muss ich für meinen Fall in einer IF Schleife den Index immer von 1-50 zählen lassen und vergleichen bzw dann mit dem Wert größer 50 wieder auf 1 setzen oder gibt es bessere Lösungen ?

Danke schonmal.
 
1. Es gibt keine IF-Schleifen
2. FOR-Schleifen sind hervorragend geeignet, damit Arrays zu durchlaufen.
3. Profis benutzen standardmäßig Arrays, die mit Index 0 beginnen, also nicht [1..50] sondern [0..49]. Startindex <> 0 nur, wenn es dafür einen Grund gibt.

Code:
#Suchwert := 123;
#Fundstelle := 0;

FOR #i := 1 TO 50 DO
    IF "MyDB".MyArray[#i] = #Suchwert THEN
        #Fundstelle := #i; //Index der Fundstelle merken
        EXIT; //und Suchschleife verlassen
    END_IF ;
END_FOR;

IF #Fundstelle <> 0 THEN ...

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald und danke für den Tipp!
da ich aus S7 Classic komme bin ich da noch ein wenig grün.

ich hab da schon ein vorgegebenes Programm bei dem die Array 1-50 drin sind. Das mit dem Index speichern ist wirklich gut so weiß ich auch welches in welchem Array der letzte wert war.

Ich werde das morgen mal testen und Feedback geben.

Danke vorab :)
 
Ich habe mehrere Array (1-50) und möchte diese durchgehend auf einen Wert vergleichen mit welchem ich dann eine visuelle Anzeige schalte.
Meinst Du wirklich mehrere Arrays, 1..50 Stück? Oder meinst Du "nur" ein Array mit 1..50 Elementen?
Nun hab ich mir zunächst eine FOR Schleife gemacht, aber die scheint für den Einsatz nicht gerade ideal zu sein.
Kann es sein, dass Du auf der Suche nach einer Möglichkeit bist, eine FOR-Schleife "vorzeitig" zu beenden/abzubrechen, sobald etwas gesuchtes gefunden wurde? --> siehe EXIT in Haralds Beispiel.
Muss ich für meinen Fall in einer IF Schleife den Index immer von 1-50 zählen lassen und vergleichen bzw dann mit dem Wert größer 50 wieder auf 1 setzen oder gibt es bessere Lösungen ?
Kann es sein, dass Du o.g. Möglichkeit, eine FOR-Schleife vorzeitig abzubrechen, nicht kanntest, und deshalb geneigt warst, eine selbstgebastelte Schleife zu bauen unter Verwendung einer IF-Abfrage? Wie wolltest Du denn die eigentliche Schleife - d.h. das wiederholte Durchlaufen derselben Befehle - realisieren? Mit WHILE oder REPEAT oder GOTO?

Code:
// Beispiel 1, den Index von 1..50 zu durchlaufen:
IF idx > 49 THEN
    idx := 1 ;
ELSE
    idx := idx + 1 ;
END_IF ;

// Beispiel 2, den Index von 1..50 zu durchlaufen:
idx := (idx MOD 50) + 1 ;

// Beispiel, den Index von 0..49 zu durchlaufen:
idx := (idx + 1) MOD 50 ;
 
Hallo! Sorry für die späte Antwort. Ich kannte in der Tat das mit der FOR Schleife nicht und hatte mich da etwas versucht.

Ich hatte es so anfangs versucht.

FOR #zähler := 1 to 50 by +1 do

Anzeige := myDB.myArray(#zähler) = WertAusVisu

End_For;

Ich dachte die FOR Schleife zählt dann jedesmal die 50 Array durch und schaut ob der Wert irgendwo drin steht bzw. setzt dann die Ausgabe auf True , aber da scheine ich nicht ganz verstanden zu haben wiexdiese Schleife funktioniert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo! Sorry für die späte Antwort. Ich kannte in der Tat das mit der FOR Schleife nicht und hatte mich da etwas versucht.

Ich hatte es so anfangs versucht.

FOR #zähler := 1 to 50 by +1 do

Anzeige := myDB.myArray(#zähler) = WertAusVisu

End_For;

Ich dachte die FOR Schleife zählt dann jedesmal die 50 Array durch und schaut ob der Wert irgendwo drin steht bzw. setzt dann die Ausgabe auf True , aber da scheine ich nicht ganz verstanden zu haben wiexdiese Schleife funktioniert.
Deine Schleife läuft aktuell in jedem Zyklus durch und Anzeige wird eben TRUE oder FALSE, je nach dem was dein Vergleich für ein Ergebnis liefert. Wenn du nach einem TRUE in Anzeige die Schleife verlassen möchtest, schau dir mal die Funktion EXIT in SCL an (F1 fürs Handbuch)
 
Das seltsame ist dass ich nie einen True bekomme so wie ich es programmiert habe und nicht sehe warum das so ist.
Die Variable“Anzeige“ hab ich alsstatiscje angelegt , aber das sollte ja kein Problem sein. Es kommt mir so vor als hätte der vergleichen ein Problem.
 
Hast du dir den Beitrag von @DCDCDC durchgelesen ? Das wäre eine mögliche Antwort.
Wenn du eine Übereinstimmung hast dann solltest du die Schleife abbrechen - nehmen wir einmal an, dass Index 11 übereinstimmt - dann hast du hier für einen ganz ganz kurzen Moment TRUE ... Index 12 stimmt aber nicht mehr überein - da wird dann aus deinem TRUE wieder ein FALSE.

Die andere Möglichkeit, die es auch noch gibt (aber dafür muss das Erstgenannte erstmal funktionieren), ist, dass dein Wert nur ungefähr übereinstimmt - also 12,001 ist nicht gleich 12. Dieses Thema hättest du dann falls du mit REAL-zahlen vergleichen willst ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine Schleife liefert immer nur das Ergebnis des letzten Vergleichs (bei #zähler = 50). Die vorhergehenden Vergleichsergebnisse werden jeweils im nächsten Schleifendurchlauf überschrieben. Willst Du den Index des ersten erfüllten Vergleichs, dann musst Du beim Fund die Schleife verlassen (EXIT). Hier ist es tatsächlich besser, das Vergleichsergebnisse mit IF..THEN abzufragen
 
hallo! Ja habe ich und den Exit habe ich auch dementsprechend rein programmiert. Bei der FOR Schleife wird in jeden Zyklus von 1-50 gezählt oder muss ich den Zähler auf 0 oder 1 zurück setzen ?
 
Ah ok diese Aussage hilft mir. Das heißt wenn ich das Exit nicht richtig setze wird vom nächsten Array der Wert wieder überschrieben. Dann versuche ich es nochmal mit einer IF Anfrage in Kombination.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
so würde es nachher aussehen.

FOR #zähler := 1 to 50 by +1 do

IF myDB.myArray(#zähler) = WertAusVisu THEN EXIT;
END_IF;
Anzeige := TRUE;
End_For;

Wird so meine Anzeige noch geschaltet oder passiert das durch den Exit nicht?
 
so würde es nachher aussehen.

FOR #zähler := 1 to 50 by +1 do

IF myDB.myArray(#zähler) = WertAusVisu THEN EXIT;
END_IF;
Anzeige := TRUE;
End_For;

Wird so meine Anzeige noch geschaltet oder passiert das durch den Exit nicht?

Da wäre "Anzeige" immer true...


Code:
FOR #zähler := 1 to 50 by +1 do
    IF myDB.myArray(#zähler) = WertAusVisu THEN
        Anzeige := TRUE;
        EXIT;
    END_IF;
End_For;
 
Ich habe mir jetzt nicht alles hier durchgelesen, welche Funktion genau gefordert wird, werfe aber noch folgendes in den Raum:
Code:
Anzeige := FALSE;
FOR #zähler := 1 TO 50 DO
    IF myDB.myArray(#zähler) = WertAusVisu THEN
        Anzeige := TRUE;
        EXIT;
    END_IF;
END_FOR;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
so würde es nachher aussehen.

FOR #zähler := 1 to 50 by +1 do

IF myDB.myArray(#zähler) = WertAusVisu THEN EXIT;
END_IF;
Anzeige := TRUE;
End_For;

Wird so meine Anzeige noch geschaltet oder passiert das durch den Exit nicht?
Vergleiche deinen Code mit Beitrag #2, da steht seit mehr als einen Monat die Lösung. Liest du die Antworten nicht?
 
Zurück
Oben