Wert von Array an Stelle auslesen, wo Array nicht beschrieben ist

Zuviel Werbung?
-> Hier kostenlos registrieren
Ich beharre nicht auf einer While-Schleife. Ich bin gerne für die beste Lösung offen, aber ich sehe gerade nicht, weshalb

FOR nSchrittsuche :=GVLiSchritt TO nSchrittsuche <= iSchrittgrenze DO
IF GVL.aHydroProgramm[1][nSchrittSuche] >= 0 THEN
EXIT;
END_IF;
END_FOR;

onjektiv besser ist als

WHILE GVL.aHydroProgramm[1][nSchrittSuche] <= 0 AND GVL.iSchritt <= iSchrittgrenze DO
nSchrittSuche:=nSchrittSuche+1;
END_WHILE

Wenn es konkrete Argumente gibt, nehme ich die For-Schleife gerne an
Wie schon geschrieben, sind WHILE und REPEAT-Schleifen potentiell endlose Schleifen, daher werden sie von erfahrenen Programmierern gerne vermieden, um nicht in Probleme, wie Deinem hineinzulaufen, daß man eine Bedingung vergessen hat, bei der die Schleife dann doch endlos wird.

Außerdem will man ja in der Regel eh irgendwo hindurchiterieren, da drängt sich dann eine iterative Schleife direkt auf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre das nicht auch eine gute Lösung?:

WHILE GVL.aHydroProgramm[1][nSchrittSuche] <= 0 AND GVL.iSchritt <= iSchrittgrenze DO
nSchrittSuche:=nSchrittSuche+1;
END_WHILE

Somit spare ich mir ein IF und ein EXIT und bewege mich dennoch nur in den Arraygrenzen
Und wie soll die Schleife zu einem Ende kommen, wenn der Speicher alles 0 enthält???

Außerdem prüft man zuerst den Index (oder stellt sicher), ob der Wert im zulässigen Bereich ist, und greift erst danach mit dem Index auf das Array zu.
 
Also ob dieses "nSchrittsuche <= iSchrittgrenze DO" funktioniert bezweifle ich - das Ergebnis davon kann eigentlich nur ein TRUE oder FALSE sein ...

Um deine Frage zu beantworten : Eine FOR .. TO Schleife hält sich bei korrekter Formulierung schon mal ganz automatisch an deine Array-Grenzen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und wie soll die Schleife zu einem Ende kommen, wenn der Speicher alles 0 enthält???

Außerdem prüft man zuerst den Index (oder stellt sicher), ob der Wert im zulässigen Bereich ist, und greift erst danach mit dem Index auf das Array zu.
Das "AND GVL.iSchritt <= iSchrittgrenze DO" muss ""AND nSchrittSuche <= iSchrittgrenze DO" heißen, das hatte ich ausversehen falsch kopiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kann aber nur durch "unlogische" Programmierung passieren?
Und wie soll die Schleife zu einem Ende kommen, wenn der Speicher alles 0 enthält???
Bei der WHILE bist du darauf angewiesen, willst du wirklich bei jedem Zyklus hoffen und beten dass mindestens dein letztes Fach einen Wert >0 enthält? Ich glaube und hoffe nicht.
 
Vielleicht mal so nebenher :
Die Leute, die dir hier alle so geantwortet haben, sind alle welche, die dir einfach nur helfen wollten ... es wollte dich keiner bekehren ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht mal so nebenher :
Die Leute, die dir hier alle so geantwortet haben, sind alle welche, die dir einfach nur helfen wollten ... es wollte dich keiner bekehren ...
Ja das weiß ich, ich bin allerdings noch recht am Anfang würde ich sagen und würde gerne verstehen, weshalb Lösung A besser ist als Lösung B. Daher meine vielen kritischen Fragen
 
@mikoborn bitte beachte den Hinweis:
Erstmal solltest Du für Code bitte die Code Tags nehmen. Die kannst Du entweder von Hand eingeben oder auf den entsprechenden Button klicken. Den Button findest Du indem über die drei Punkte weitere Buttons anzeigen lässt.

Dann würde dein Code viel besser lesbar so aussehen:
Code:
FOR nSchrittsuche :=GVLiSchritt TO nSchrittsuche <= iSchrittgrenze DO
    IF GVL.aHydroProgramm[1][nSchrittSuche] >= 0 THEN
       EXIT;
    END_IF;
END_FOR;
Code:
WHILE GVL.aHydroProgramm[1][nSchrittSuche] <= 0 AND GVL.iSchritt <= iSchrittgrenze DO
                    nSchrittSuche:=nSchrittSuche+1;
END_WHILE
Außerdem, wenn man außerhalb von Code-Tags array[i] schreibt, dann wird das [i] nicht angezeigt, sondern als "kursiv"-Format-Tag interpretiert.
 
wobei dies :
Code:
FOR nSchrittsuche :=GVLiSchritt TO nSchrittsuche <= iSchrittgrenze DO
nicht funktionieren kann weil "nSchrittsuche <= iSchrittgrenze" ein BOOL-Ergebnis bringt - es müßte also eigentlich schon eher so heissen :
Code:
FOR nSchrittsuche :=GVLiSchritt TO  iSchrittgrenze DO
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wobei dies :
Code:
FOR nSchrittsuche :=GVLiSchritt TO nSchrittsuche <= iSchrittgrenze DO
nicht funktionieren kann weil "nSchrittsuche <= iSchrittgrenze" ein BOOL-Ergebnis bringt - es müßte also eigentlich schon eher so heissen :
Code:
FOR nSchrittsuche :=GVLiSchritt TO  iSchrittgrenze DO
Danke für die Korrektur...
 
Ja das weiß ich, ich bin allerdings noch recht am Anfang würde ich sagen und würde gerne verstehen, weshalb Lösung A besser ist als Lösung B. Daher meine vielen kritischen Fragen
Jeder hier hat dir mindestens die gleichen Gründe genannt, weswegen wir auf Steuerungen welche ja zyklusabhängig arbeiten, FOR Schleifen bevorzugen.
 
Vielen Dank für den Hinweis, als kleiner Test hier mein aktueller Code:
FOR nSchrittSuche:=GVL.iSchritt+1 TO iSchrittgrenze DO IF GVL.aHydroProgramm[1][nSchrittSuche] > 0 THEN EXIT; END_IF END_FOR

hhmmm...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Außerdem prüft man zuerst den Index (oder stellt sicher), ob der Wert im zulässigen Bereich ist, und greift erst danach mit dem Index auf das Array zu.
WHILE GVL.aHydroProgramm[1][nSchrittSuche] <= 0 AND nSchrittSuche <= iSchrittgrenze DO
nSchrittSuche:=nSchrittSuche+1;
END_WHILE

Der rot markierte Code verletzt im letzten Schleifendurchlauf die Arraygrenzen, weil erst auf das Array zugegriffen wird und erst danach festgestellt wird, daß der Index nSchrittSuche zu groß ist.
Je nachdem wie der ST-Compiler optimiert, könnte es helfen, wenn man den Code so 'rum formuliert, und dadurch der Array-Zugriff nicht mehr ausgeführt wird:
WHILE nSchrittSuche <= iSchrittgrenze AND GVL.aHydroProgramm[1][nSchrittSuche] <= 0 DO
nSchrittSuche:=nSchrittSuche+1;
END_WHILE
 
FOR nSchrittSuche:=GVL.iSchritt+1 TO iSchrittgrenze DO IF GVL.aHydroProgramm[1][nSchrittSuche] > 0 THEN EXIT; END_IF END_FOR

Nicht die Inline-Code Tags [ICODE] nehmen (die sind für Code innerhalb einer Textzeile), sondern die Code-Block Tags [CODE]
Code-Button.png
dann sieht der Code-Block so aus:
Code:
FOR nSchrittSuche:=GVL.iSchritt+1 TO iSchrittgrenze DO
                    IF GVL.aHydroProgramm[1][nSchrittSuche] > 0 THEN
                        EXIT;
                    END_IF
                END_FOR
 
Zurück
Oben