For Schleife verlassen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: For Schleife verlassen

Re: For Schleife verlassen

von clag » Mi, 07.07.2010 15:48

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

Re: For Schleife verlassen

von Stephan » Mi, 07.07.2010 09:18

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

Re: For Schleife verlassen

von bst » Mi, 07.07.2010 09:12

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

Re: For Schleife verlassen

von clag » Mi, 07.07.2010 09:00

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)

Re: For Schleife verlassen

von Stephan » Mi, 07.07.2010 08:45

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

Re: For Schleife verlassen

von clag » Mi, 07.07.2010 07:30

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:

Re: For Schleife verlassen

von Karolus » Mi, 07.07.2010 07:08

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

Re: For Schleife verlassen

von komma4 » Mi, 07.07.2010 07:04

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

For Schleife verlassen

von clag » Mi, 07.07.2010 06:50

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 ;)

Nach oben