continue must be eclosed by a loop

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: continue must be eclosed by a loop

Re: continue must be eclosed by a loop

Post by Folllast » 28 Feb 2018, 00:21

hab mir das gerade mal Funktionen angeschaut, wenn ich einen einfachereren Fall habe werde ich mir mal eine zusammen basteln. Aber momentan ist die Varianz der IF-Blöck noch zu groß für mich.

Code: Select all

Loop, Read, %eingabe%
	{							; Eingabefile lesen
	
	If A_Index < 14									; die ersten 14 Zeilen überspringen
		Continue
	StringSplit, Feld, A_LoopReadLine,`;			; Zeile aus CSV bei Semikolon trennen
	debitornummer = %Feld1%							; Spalte 1 = Debitornummer
	debitorname = %Feld2%							; Spalte 2 = Debitorname
	nummer = %Feld4%									; Spalte 4 = Artikelnummer bzw. Auftragsnummer
	name = %Feld5%									; Spalte 5 = Beschreibung
	menge = %Feld6%									; Spalte 6 = Menge
	MsgBox, %nummer%	
	If A_Index = 14
	{							; Zeile 14
		MsgBox, 
		debnr = debitornummer						; Debitornummer "merken"
		debname = debitorname						; Debitorname "merken"
		menge = 0									; Menge nullen		
		Continue								; nächste Zeile lesen
		}
	If A_Index = 15	
	{							; Zeile 15
		auftragsnummer = name					; Auftragsnummer "merken"
		continue
		}
	if nummer between XXX and XXX
	{				; wenn Artikelnummer zwischen XXX & XXX ist
 	    ;MsgBox, test
		StringSplit, dimension, name,[%A_Space%]xX				; Beschreibung Teilen bei Leerzeichen, x oder X
		If (dimension1 = "XXX" or dimension1 = "XXX")
		{		; wenn der 1 String die XXX oder XXX ist....
			mengelfwa += %menge%								; menge LFWA um Menge erhöhen
			menge += %menge%									; Menge um Menge erhöhen
														; nächste Zeile lesen
			}
		else
		{
			menge += %menge%										; Nur Menge erhöhen
			continue											; nächste Zeile lesen
		}  
	if nummer between XXX and XXX
	{				; wenn die Artikelnummer zwischen XXX & XXX ist
		kupfer =1
		continue
		}
	if (nummer = XXX)
	{
					; wenn die Artikelnummer XXX
		verstaerkt =1
		continue
		}
	if (nummer = "Auftragsnr.")
	{				; wenn ein neuer Auftrag anfängt
		FileAppend, %menge%`;, ausgabe.csv			; Menge in die erste Spalte
		FileAppend, %mengelfwa%`;, ausgabe.csv			; Menge in die erste Spalte
		FileAppend, %debname%`;, ausgabe.csv			; Menge in die erste Spalte
		FileAppend, %auftragsnummer%`;, ausgabe.csv			; Menge in die erste Spalte
		FileAppend, %kupfer%`;, ausgabe.csv			; Menge in die erste Spalte
		FileAppend, %verstaerkt%`;, ausgabe.csv			; Menge in die erste Spalte
		MsgBox, fertig

		}
		MsgBox, ok
		if debitornummer between XXX and XXX
		{			; wenn die ersten Spalte eine Debitornummer ist
		
		; Die Werte müssen in eine neue Variable(debnr), da die alten (debitornummer) bei jeder Zeile neu beschrieben werden
		auftragsnummer := nummer					; Auftragsnummer "merken"
		debnr := debitornummer						; Debitornummer "merken"
		debname := debitorname						; Debitorname "merken"
		menge := 0									; Menge nullen		
		Continue									; nächste Zeile lesen
	}
	;MsgBox, %nummer%
}
}

Re: continue must be eclosed by a loop

Post by BoBo » 27 Feb 2018, 09:35

in wirklichkeit kommen danach aber noch tausdende, identische IF-Blöcke, ...
Das schreit aber jetzt schon danach daraus eine function zu wursten. Zudem das die maintenance/wartung immens vereinfachen würde.

Re: continue must be eclosed by a loop

Post by Folllast » 27 Feb 2018, 08:52

gregster wrote:Das zweite continue (im if-Block) macht aber meines Erachtens (in diesem Snippet) keinen Sinn, da hier eine Loop-Iteration "abgekürzt" wird, die eh schon zu Ende ist. Wenn du dagegen den gesamten Loop abbrechen willst, bist du wahrscheinlich eher an Break interessiert. https://ahkde.github.io/docs/commands/Break.htm

Andererseits schreibst du als Kommentar "; nächste Zeile lesen" zum continue - dann wäre Break zweifellos falsch. Also weder Break noch continue verwenden, wobei letzteres zumindest nicht schadet, auch wenn es nix bringt.

Bei "[n]achfolgenden IF-Bedingungen" im gleichen Loop-Block würde continue dagegen zur nächsten Loop-Iteration übergehen und "den ganzen Rest" des aktuellen Durchlaufs überspringen - das ist korrekt und dann wahrscheinlich sinnvoll.
Hallo Vielen Dank.

du hast recht, in diesem Ausschnitt macht der zweite Continue-Befehlt keinen Sinn, in wirklichkeit kommen danach aber noch tausdende, identische IF-Blöcke, die man sich sparen kann, weil immer nur einer stimmt.

Re: continue must be eclosed by a loop

Post by gregster » 27 Feb 2018, 08:39

Das zweite continue (im if-Block) macht aber meines Erachtens (in diesem Snippet) keinen Sinn, da hier eine Loop-Iteration "abgekürzt" wird, die eh schon zu Ende ist. Wenn du dagegen den gesamten Loop abbrechen willst, bist du wahrscheinlich eher an Break interessiert. https://ahkde.github.io/docs/commands/Break.htm

Andererseits schreibst du als Kommentar "; nächste Zeile lesen" zum continue - dann wäre Break zweifellos falsch. Also weder Break noch continue verwenden, wobei letzteres zumindest nicht schadet, auch wenn es nix bringt.

Bei "[n]achfolgenden IF-Bedingungen" im gleichen Loop-Block würde continue dagegen zur nächsten Loop-Iteration übergehen und "den ganzen Rest" des aktuellen Durchlaufs überspringen - das ist korrekt und dann wahrscheinlich sinnvoll.
Die Verwendung von else if wäre vermutlich eine Alternative, wenn der nachfolgende Code in der Schleife auschließlich aus weiteren If-Abfragen besteht.

Re: continue must be eclosed by a loop

Post by gregster » 27 Feb 2018, 08:27

Nein, bitte nicht goto :sick: . Wie just me schon ausführte, wird die öffnende Blockklammer des Loops in deinem Skript einfach ignoriert. Wenn der OTB-Stil also nicht funktioniert, schreibt man die die öffnende Klammer in die nächste Zeile bzw "repariert" in deinem Fall damit den Loop.

Code: Select all

Loop, Read, %eingabe%		; statt Loop, Read, %eingabe%	{	
{	

Re: continue must be eclosed by a loop

Post by Folllast » 27 Feb 2018, 08:19

OK, wenn ich das richtig verstehe denkt AHK also, das continue gehört zu der IF-Anweisung und nicht zu der Loop-Schleife.
Arbeitet man dann mit GOTO-Befehlen oder gibt es noch eine elegantere Möglichkeit die Schleife enden zu lassen.

Ich mache die Continue-Befehle ans ende einer IF-Bedingung, damit er nicht den ganzen Rest noch abläuft, obwohl die Nachfolgenden IF-Bedingungen nicht erfüllt sein können. Macht das überhaupt sinn?

Re: continue must be eclosed by a loop

Post by just me » 27 Feb 2018, 07:54

Moin,

die Loop-Anweisungen in AHK unterstützen mit Ausnahme von Loop, [%Anzahl%] nicht den OTB-Stil. Netterweise wird die öffnende Blockklammer { einfach nur ignoriert. Der Loop-Anweisung ist deshalb nur genau eine (die folgende) Zeile zugeordnet.

continue must be eclosed by a loop

Post by Folllast » 27 Feb 2018, 07:47

Hallo,

bekomme bei dem Script die Fehlermeldung, dass Continue nur in einer Schleife verwendet werden kann. Aber nach m.E. steht es in einer. Wo ist mein Denkfehler?

Der Fehler tritt beim 2. Continue auf, die "ersten 14 Zeilen überspringen" klappt super!

Code: Select all

Loop, Read, %eingabe%	{							; Eingabefile lesen
	If A_Index < 14									; die ersten 14 Zeilen überspringen
		Continue
	StringSplit, Feld, A_LoopReadLine,`;			; Zeile aus CSV bei Semikolon trennen
	debitornummer := Feld1							; Spalte 1 = Debitornummer
	debitorname := Feld2							; Spalte 2 = Debitorname
	nummer := Feld4									; Spalte 4 = Artikelnummer bzw. Auftragsnummer
	name := Feld5									; Spalte 5 = Beschreibung
	menge := Feld6									; Spalte 6 = Menge
		
	If A_Index = 14
	{							; Zeile 14
		debnr := debitornummer						; Debitornummer "merken"
		debname := debitorname						; Debitorname "merken"
		menge := 0									; Menge nullen		
		Continue								; nächste Zeile lesen
		}
	}
davor und danach kommt noch eine ganze menge geprassel, was aber nicht relevant sein sollte?!

Top