For Schleife verlassen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

For Schleife verlassen

Beitrag von clag »

Moin liebe Kenner und Könner

hier kommt die Frage einer Basic SAU (stupid asking user) :lol: :lol:

wie kann ich eine doppelte FOR () verlassen
und kann man wie angedeutet neue For Schleifen beginnen mit den gleichen Zähler Variablen
in der Annahme die Zählerstände der verlassenen For schleifen werden übernommen ?

Code: Alles auswählen

..........
  For X 1-5  ...
    For y 1-9 ...
     if 1+1=2 print "richtig" 
       if  "hier wahr" go to weiter1   
     print "hallo "
    next
  next

:weiter1
  For X 1-5  ...
    For y 1-9 ...
wie müsste nun diese Zeile "if "hier wahr" go to weiter1 " in richtig aussehen
meine Idee dabei ist die gleichen Schleifen mit einer ersetzten Zeile "if 1+1=2 print "richtig" auzszuführen

aber auslachen gildet nicht ;)
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: For Schleife verlassen

Beitrag von komma4 »

F1 Onlinehilfe Basic :D


EXIT FOR um eine Schleife zu verlassen
oder
GOTO Anweisung nutzen


Alternativ die Codierung ändern WHILE-Schleife nutzen, und die Zähler auf Maximalwert setzen:

Code: Alles auswählen

x = 1
y = 1
WHILE ( x<6 AND y<10 )

' wenn verlassen werden soll
x = 6
y = 10


'sonst hochzählen
x = x +1

WEND
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: For Schleife verlassen

Beitrag von Karolus »

Hallo
Wenn du die "Zählerstände" der Schleifen übernehmen möchtest die du verlässt, willst du diese garnicht verlassen sondern innerhalb der Schleife ein 'if ... then [else]'

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: For Schleife verlassen

Beitrag von clag »

Moin Ihr ...

vergesst bitte nicht den einleitenden dezenten Hinweis ! :roll:

@ Karo
jaaannnein also eigentlich hast du schon recht,

ich möchte erreichen, dass das "if Gebilde" welches ich zum verlassen von for anwende
nach einmaligem wahr nicht Weiter unnötig oft ausgeführt wird,

also ein Sprung zu einem gleichen For For Konstrukt nur ohne "if "hier wahr" go to weiter1 "
und geändertem "if 1+1=2 print "richtig" " auf if 1+3=4 print "auch richtig"


ich befürchte das Beschriebene wird in euren Basic Augen zu massivem Juckreiz führen :oops:
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: For Schleife verlassen

Beitrag von Stephan »

wie müsste nun diese Zeile "if "hier wahr" go to weiter1 " in richtig aussehen
Einfach in der Programmhilfe (F1) nachsehen - solche Dinge wie IF-THEN-GOTO betreffen die Sprache (StarBasic) und nicht das Objektmodell und sind in der Hilfe (eigentlich vollständig und erschöpfend) beschrieben

Code: Alles auswählen

If hier = 1 Then Goto weiter1
bzw. allgemein:

Code: Alles auswählen

If <Bedingung> Then Goto weiter1
und kann man wie angedeutet neue For Schleifen beginnen mit den gleichen Zähler Variablen
in der Annahme die Zählerstände der verlassenen For schleifen werden übernommen ?
Angedeutet ist da nichts Erkennbares (außer wiederum allgemein zwei Schleifen). So wie Du die FRage stellst muß man das Ganze jedoch klar mit Nein beantworten. Die Zählerstände entsprechen den Werten der Variablen und es ist deshalb nicht direkt möglich mit den gleichen Variablen und vorhandenen Zählerständen fortzusetzen - es gilt eigentlich ohnehin was Karo sagte.

Soll doch mit gleichen Variblen und Zählerständen fortgesetzt werden (wofür es technisch keinen Grund gibt, denn die Nutzung der vorhandenen Zählerstände mit anderen Variablen wäre leichter), müssen halt die Zählerstände zweimal übergeben werden:

Code: Alles auswählen

'...

:weiter1
x1 = X
y1 = Y

For X = x1 To 5
  For Y = y1 To 9
   '...
  Next Y
Next X

ich möchte erreichen, dass das "if Gebilde" welches ich zum verlassen von for anwende
nach einmaligem wahr nicht Weiter unnötig oft ausgeführt wird,


das ist mit Goto, wie auch bereits von Komma4 benannt, möglich z.B.:

Code: Alles auswählen

If hier = 1 Then Goto weiter1


(s.o.), da so beide Schleifen verlassen werden, also nichts nochmals wiederholt wird



Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: For Schleife verlassen

Beitrag von clag »

Hallo

dank eurer Hilfe "ist Flasch voll und ich habe fertig" :)

jetzt geht es mir erst einmal um eure Prüfung auf die Korrektheit des zusammengestellten Code bzw ob

1. so wie ich es mit Sprungmarke und den doppelten For For schleifen gemacht habe, hege ich die Hoffnung,
dass die "sp" und "ze" Werte nach dem Sprung mitgenommen werden
und das zweite For For Konstrukt da weitermacht wo das erste verlassen wurde ?
ist diese Hoffnung berechtigt ?

2. eine Lösung ohne sprung Marke, machbar/ sinnvoll weil besser wäre ?

hier die involvierten Threads
viewtopic.php?f=2&t=39940
viewtopic.php?f=18&t=39949

Code: Alles auswählen

Sub BF_markern
   oDoc = ThisComponent
   oSheet = ThisComponent.CurrentController.getActiveSheet()
   oZell = oDoc.getCurrentSelection()
   oZell.supportsService("com.sun.star.sheet.SheetCellRange")
   oSelect=ThisComponent.CurrentSelection.getRangeAddress
   oSelectColumn=ThisComponent.CurrentSelection.Columns
   oSelectRow=ThisComponent.CurrentSelection.Rows
   CountColumn=oSelectColumn.getCount
   CountRow=oSelectRow.getCount
   Start_Column=oSelect.StartColumn
   End_Column=oSelect.EndColumn
   Start_Row =oSelect.StartRow
   End_Row=oSelect.EndRow
   For sp = Start_Column to End_Column
		For ze = Start_Row to End_Row
		oSelectSR = oSelect.StartRow + 1
		oSelectEC = oSelectColumn.getByIndex(CountColumn-1).getName
		oBereich = oSheet.getCellByPosition(sp,ze)   
		oBedingungen = oBereich.getPropertyValue( "ConditionalFormat" )
		BedFormat = oBedingungen.Count
			if BedFormat > 0 Then
				if  oBereich.Annotation.IsVisible = true then
				goto sprung1 
				end if
			oSheet.getAnnotations.insertNew(obereich.celladdress(), "Zelle enthält ein BF" 
REM hier ggf die BF neu auslesen und in die Kommentare neu einfügen
			oBereich.Annotation.setIsVisible( True )
			end if
		next ze
	next sp
   msgbox "Die Überprüfung ist abgeschlossen!",64, "BF markern"
exit sub   
   sprung1: 
'	print "habe fertig gesprungen :)"
	For sp = Start_Column to End_Column
		For ze = Start_Row to End_Row
		oSelectSR = oSelect.StartRow + 1
		oSelectEC = oSelectColumn.getByIndex(CountColumn-1).getName
		oBereich = oSheet.getCellByPosition(sp,ze)   
		oBedingungen = oBereich.getPropertyValue( "ConditionalFormat" )
		BedFormat = oBedingungen.Count
			if BedFormat > 0 Then
REM hier ggf die BF neu auslesen und in die Kommetare neu einfügen
			oBereich.Annotation.setIsVisible( false )
			end if
		next ze
	next sp
   msgbox "alle BF Kommentare ausgeblendet ",64, "BF markern"
End Sub
edit
hier noch das Beispiel dazu
BF-markieren_1.ods
(11.91 KiB) 50-mal heruntergeladen
PS
basiert alles auf zusammengeklaubten Codestückchen
so copyright by everybody 8)
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: For Schleife verlassen

Beitrag von bst »

Morgen,

zwei weitere Alternativen.

cu, Bernd
--

Code: Alles auswählen

REM  *****  BASIC  *****

Option Explicit

Sub Main
	dim x as integer, y as integer, bExit as boolean
	
	for x = 1 to 10
		for y = 1 to 5
			if x = 3 and y = 4 then 
				bExit = true
				exit for
			endif
		next
		if bExit then exit for
	next
	
	print x, y
End Sub

Sub Main2
	dim x as integer, y as integer
	
	x = 1
	do while x <= 10
		for y = 1 to 5
			if x = 3 and y = 4 then exit do
		next
		x = x + 1
	loop

	print x, y
End Sub
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: For Schleife verlassen

Beitrag von Stephan »

1. so wie ich es mit Sprungmarke und den doppelten For For schleifen gemacht habe, hege ich die Hoffnung,
dass die "sp" und "ze" Werte nach dem Sprung mitgenommen werden
und das zweite For For Konstrukt da weitermacht wo das erste verlassen wurde ?
ist diese Hoffnung berechtigt ?
Nein.

Ich hatte auch bereits, am Beispiel der 2 anderen SChleifen, ausführlich erläutert warum nicht!
2. eine Lösung ohne sprung Marke, machbar/
Ja.
Wie bereits von Komma4 benannt, geht auch Exit For, was wegen der speziellen Anforderung nichts zu wiederholen, zweimal ausgeführt, also für innere (Y-Zähler) und äußere Schleife (X-Zähler), werden müßte
sinnvoll weil besser wäre ?
Nein, es ist lediglich ggf. aufwendiger.



Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: For Schleife verlassen

Beitrag von clag »

Hallo,

nachdem ich noch eine Weile auf den Info's hier gekaut habe

ist mir nun hoffentlich aufgegangen wie man die Werte aus der ersten ForSchleifenGruppe in eine andere angesprungene ForSchleifenGruppe übernimmt,
um an der Zellposition die man in ForGruppe1 verlassen hat, mit anderen Bedingungen in ForGruppe2 weiter zumachen.
Wenn man es erst einmal geschnallt hat ist es doch ganz logisch ........

Code: Alles auswählen

   
For sp = Start_Column to End_Column
  For ze = Start_Row to End_Row
  ...........
    if BedFormat > 0 Then
      if  ..... = true then
      goto sprung1 
      end if
    ........ 
    end if
  next ze
next sp
exit sub   

sprung1: 
For spx = sp to End_Column
  For zex = ze_Row to End_Row
  .......
  if BedFormat > 0 Then
  .........
  end if
  next zex
next spx

End Sub
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten