INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Dieses Thema hat akzeptierte Lösungen:

While Loop Case überspringen



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

29.12.2014, 10:27
Beitrag #1

PaulC Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Dec 2014

2014
2014
kA


Deutschland
While Loop Case überspringen
Hallo liebe Gemeinde,

trotz Google und der Forum-Suche habe ich bisher noch keine Antwort zu meinem Problem gefunden.

Ich habe zwei Schleifen, die ineinander geschachtelt sind. Ich möchte dazu zwei Button erzeugen. Der eine soll die innere Schleife beenden, so dass der nächste Laufindex der Schleife gestartet wird und der zweite Button soll das gleiche für die äußere Schleife erledigen, wobei die innere Schleife wieder von 1 loszählen soll.

Da ich gelesen habe, dass mann bei For-Schleifen nicht den Index überspringen kann/sollte, habe ich dies mit zwei While-Schleifen probiert. Für die innere Schleife funktioniert dies, für die äußere Schleife nicht.

Wie geht man in einem solchen Fall vor? Kann man die Laufvariable manipulieren?


Beste Grüße
Paul
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.12.2014, 13:01
Beitrag #2

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: While Loop Case überspringen
Hallo Paul,

Zitat:Der eine soll die innere Schleife beenden, so dass der nächste Laufindex der Schleife gestartet wird
Was heißt das genau? soll die innere Schleife einfach die nächste Iteration ausführen - oder soll die innere Schleife beendet werden?

Zitat: und der zweite Button soll das gleiche für die äußere Schleife erledigen, wobei die innere Schleife wieder von 1 loszählen soll.
Der Schleifenindex beginnt in LabVIEW (wie in jeder vernünftigen Programmiersprache) von Null an zu zählen.
Das ist Grundlagenwissen und wird in den Links in meiner Signatur erläutert…

Zitat:Da ich gelesen habe, dass mann bei For-Schleifen nicht den Index überspringen kann/sollte, habe ich dies mit zwei While-Schleifen probiert.
FOR-Loops zählen den Index hoch, aber WHILE-Loops genauso! Der einzige (wesentliche) Unterschied zwischen beiden Konstrukten ist die Abbruchbedingung…

Zitat:Für die innere Schleife funktioniert dies, für die äußere Schleife nicht.
Dann hast du wohl etwas falsch programmiert…

Glas1
Dummerweise hast du kein VI angehangen. Wie soll man da helfen?
Glas2

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.12.2014, 16:38
Beitrag #3

PaulC Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Dec 2014

2014
2014
kA


Deutschland
RE: While Loop Case überspringen
Hallo Gerd, vielen Dank für deine Antwort. Jetzt sollte sich im Anhang ein Beispiel befinden.

Es sollen zwei Funktionen durch die zwei Button durchgeführt werden. Der Button innere Schleife überspringen soll dazu führen, dass die aktuelle Iteration abgebrochen wird und mit der nächsten (innere Laufvariable +1) Iteration begonnen wird.

Der zweite - noch nicht funktionierende - Button soll dazu führen, dass die innere Laufvariable wieder bei 0 (sorry für die 1 aus dem vorherigem Post) beginnt und die äußere Laufvariable bei i+1 weitermacht.

Die Funktion des VIs ist schon fast erfüllt, allerdings wird der äußere Schleifenindex erst erhöht, wenn sich der innere Schleifenindex verändert.


Angehängte Datei(en)
14.0 .vi  Beispiel.vi (Größe: 10,3 KB / Downloads: 206)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.12.2014, 17:10 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2014 17:11 von GerdW.)
Beitrag #4

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: While Loop Case überspringen

Akzeptierte Lösung

Hallo Paul,

was für eine Logik…

Zitat:Der Button innere Schleife überspringen soll dazu führen, dass die aktuelle Iteration abgebrochen wird und mit der nächsten (innere Laufvariable +1) Iteration begonnen wird.
Code:
IF Button1 THEN
  counter++
ELSE
  do nothing
ENDIF

Zitat:Der zweite - noch nicht funktionierende - Button soll dazu führen, dass die innere Laufvariable wieder bei 0 (sorry für die 1 aus dem vorherigem Post) beginnt und die äußere Laufvariable bei i+1 weitermacht.
Code:
IF Button2 THEN
  counter:=0
  counter_außen++
ELSE
  do nothing
ENDIF

Und wozu brauchst du da drei Schleifen? Wenn du deine Logik besser formulierst (!!!), kannst du das alles in einer Schleife unterbringen.
Merke:
Bevor man mit dem Programmieren loslegt, sollte man sich einen PAP auf Papier aufzeichnen…


Angehängte Datei(en)
14.0 .vi  Beispiel.vi (Größe: 9,81 KB / Downloads: 194)

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.12.2014, 18:42
Beitrag #5

PaulC Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Dec 2014

2014
2014
kA


Deutschland
RE: While Loop Case überspringen
Hallo Gerd,

vielen Dank für deine Hilfe. Ich habe sogar schon eine Art PAP erstellt, allerdings mit zwei Schleifen. Die dritte diente jediglich der Zeitsteuerung. Ich muss allerdings zugeben, dass dein Weg der elegantere ist.

Bei dem bisherigen Beispiel zählte die innere Schleife noch zeitgesteuert hoch. Würdest du in deinem Beispiel die Zeitbedingung über eine Oder-Bedingung beim Counter innere Schleife integrieren oder gibt es auch hier einen besseren Weg?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.12.2014, 09:47
Beitrag #6

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: While Loop Case überspringen
Hallo Paul,

Zitat:oder gibt es auch hier einen besseren Weg?
Über bessere Wege kann man reden, wenn man alle Bedingungen kennt.

Kannst du mal alle deine Bedingungen aufzählen? Bisher wolltest du nur zum nächsten "Index" weitergehen, wenn ein Button gedrückt wurde…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.12.2014, 12:52
Beitrag #7

PaulC Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Dec 2014

2014
2014
kA


Deutschland
RE: While Loop Case überspringen
Hallo,

was die zeitgesteuerte Schleife betrifft, soll anhand eines Arrays die jeweilige Zeit vorgegeben werden, nach welcher Zeit die innere Laufvariable ansteigt. Eine zweite Konstante soll festlegen, wie hoch die innere LV steigt, bevor diese wieder auf 0 gesetzt und die äußere LV um eins erhöht wird. Zuletzt soll es eine Art Warten-Schalter geben, der dafür sorgt, dass die innere LV und die Zeit bis zum Erhöhen dieser konstant bleiben.

Besten Gruß
Paul
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.12.2014, 16:41 (Dieser Beitrag wurde zuletzt bearbeitet: 31.12.2014 15:45 von Lucki.)
Beitrag #8

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: While Loop Case überspringen
Meinst Du es so? Den Array habe ich weggelassen.
... und auch die Schleifen im BD, denn es kommt ja wohl auf die Variablen auf dem FP an, und nicht wie man das im BD macht.

14.0 .vi  Beispiel-1-3.vi (Größe: 30,98 KB / Downloads: 241)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.12.2014, 20:09 (Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2014 20:10 von GerdW.)
Beitrag #9

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: While Loop Case überspringen
Hallo Paul,

Zitat:soll anhand eines Arrays die jeweilige Zeit vorgegeben werden, nach welcher Zeit die innere Laufvariable ansteigt. … Zuletzt soll es eine Art Warten-Schalter geben, der dafür sorgt, dass die innere LV und die Zeit bis zum Erhöhen dieser konstant bleiben.
Kannst du diese beiden Angaben mal mit einem Beispiel belegen?
Einmal gibst du eine Zeit vor, nach der die innere LV inkrementiert werden soll - und dann hast du einen Schalter, der eben dieses verzögern soll? Wie soll der Schalter für "konstante Zeit bis zum Erhöhen" sorgen, wenn du über ein Array eine andere Zeit vorgibst?
Hmm
Ich liebe klare Programmbeschreibungen…

Ansonsten: Guten Rutsch!

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.01.2015, 16:09 (Dieser Beitrag wurde zuletzt bearbeitet: 01.01.2015 16:09 von PaulC.)
Beitrag #10

PaulC Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Dec 2014

2014
2014
kA


Deutschland
RE: While Loop Case überspringen
Hallo,

nachdem Gerd mir die Idee vermittelt hat, dass ich zwei Laufvariablen/Counter auch nur mit einer Schleife erschlagen kann, gibt es nun einen counter_1 (Teilversuch) und einen counter_2 (Versuch). Bei Vorgabe von Array = kulmulierte Teilversuchszeiten, würde der gesamte Programmablauf in etwa wie folgt aussehen:

counter_1 = 0;
counter_2 = 0;
Zeit_Versuchsstart = now;

for i = 0:Array(end)
Zeit_Teilversuch = Array(i);
counter_1 = counter_1 + 1;
pause(Zeit_Teilversuch);

% Zählen Counter
if counter_1 = 5
counter_1 = 0;
counter_2 = counter_2 + 1;
end

% Berücksichtigung der veränderten Startzeiten, nachdem ein Versuch/Teilversuch abgebrochen wurde
if überspringen_counter_1 == true or überspringen_counter_2 == true
Zeit_Versuch = now;
% Ermittlung delta_Zeit_keypressed
delta_Zeit_keypressed = Array(counter_2*5 +counter_1) - Zeit_Versuch;
Array = Array - delta_Zeit_keypressed; % elementweise;
end

% Warten-Funktion
if stop_fkt = true
Wartezeit_Anfang = now;

while stop_fkt = true
Wartezeit_Ende = now;
end

delta_Zeit = Wartezeit_Ende - Wartezeit_Anfang;
Array = Array + delta_Zeit % elementweise;
end

end

Luckis Vorschlag ist nicht schlecht, allerdings gibt es den Nachteil, dass das Abbrechen eines Teilversuchs nicht sofort erfolgt. Die einzelnen Teilversuche sollen später einige hundert Sekunden dauern, weswegen ein sofortiges Reagieren von Vorteil ist.

In der angehängten Version funktioniert bisher das Zählen der Counter unter der Randbedingung, dass das Betätigen der (Teil-)Vesuch-abbrechen-Funktion sofort erfolgt.

Unklar ist mir, wie ich in Zukunft die Warten-Funktion so modifizieren kann, dass auch bei langer Wartezeit die counter konstant gehalten werden.

Euch wünsche ich ein frohes neues Jahr!


Angehängte Datei(en)
14.0 .vi  Beispiel_2.vi (Größe: 13,97 KB / Downloads: 194)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Case-Struktur: Angegebener Case nicht vorhanden braendy 10 6.829 02.02.2021 15:05
Letzter Beitrag: Lucki
  Event Case Ignoriert Tastendruck wenn in Gegenwart eines anderen "Leeren" Event Case Ksanto 8 8.256 23.10.2017 09:08
Letzter Beitrag: Ksanto
  Parallel Port Read and Write Loop.vi rothhp 2 4.288 16.12.2015 16:08
Letzter Beitrag: rothhp
  While-loop Margi 2 3.324 21.09.2015 12:49
Letzter Beitrag: TDO
  For und While Loop katana 2 4.170 29.07.2015 11:14
Letzter Beitrag: Trinitatis
  Case Strukture mit 3 Case lola2014 13 11.471 23.10.2014 14:17
Letzter Beitrag: GerdW

Gehe zu: