Seite 1 von 1

2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Mo, 12.01.2009 16:26
von gurkende_gurke
hallo zusammen,
kann ich 2 for-next-Schleifen genau zur gleichen Zeit ausführen? Wenn ja, wie? brauche dies unbedingt, da ich sonst mit meinen for-next schleifen

Code: Alles auswählen

DO
for L = 0 to 1
for L2 = 1 to 0
Sudokufeld(0,0)=rndnumber
Sudokufeld(0,1)=rndnumber
Sudokufeld(1,0)=rndnumber
Sudokufeld(1,1)=rndnumber
	if Sudokufeld(L,L)=SudokuFeld(L2,L2) or Sudokufeld(L,L2)=SudokuFeld(L2,L) then
		BLNAbbruch=false else
		BLNAbbruch=true
	endif
	if BLNAbbruch=false then 
	exit for
	endif
	if BLNAbbruch=false then
	exit for
	endif
next
next
LOOP WHILE BLNAbbruch=false
eine endlos schleife produziere... Vielen Dank für jede Hilfe. oder gibt es eine elegantere Lösung mit for next schleifen ein Vierer-Sudoku-Kästchen zu überprüfen?
PS: ich weiß, die überprüfung ist so noch nicht fertig, aber ohne 2 gleichzeitg laufende schleifen kann ich nicht weiter machen

Re: 2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Mo, 12.01.2009 18:58
von Charly
Hallo!

Ich muss zugeben ich habe die Aufgabenstellung nicht ganz verstanden. Aber du möchtest vermutlich, solange den Zufallsgenerator laufen lassen, bis sich keine Zahlen mehr gleich sind.

Dazu würde ich Feldbelegung außerhalb der For next Schleifen machen und in die For next Schleifen mit der Ende-Bedingung für die Do while Schleife starten. Die For next Schleife, verändert diese Bedingung entweder auf false und das ganze startet von neuem oder es bleibt bei der Bedingung true und die SChleife kann verlassen werden.
Etwa wie folgt:
DO
Sudokufeld(0,0)=rndnumber
Sudokufeld(0,1)=rndnumber
Sudokufeld(1,0)=rndnumber
Sudokufeld(1,1)=rndnumber
BLNAbbruch = True

for L = 0 to 1
for L2 = 1 to 0

   if Sudokufeld(L,L)=SudokuFeld(L2,L2) or Sudokufeld(L,L2)=SudokuFeld(L2,L) then
      BLNAbbruch=false
exit for
   endif
 next
 
   if BLNAbbruch=false then
   exit for
   endif
next
LOOP WHILE BLNAbbruch=false
Gruß
Charly

Re: 2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Di, 13.01.2009 08:48
von turtle47
Hallo,

@ Charly: Leider bringt Deine Variante doppelte Ergebnisse. :(

Ausserdem muss man, wenn man in einer Schleife rückwärtscounten will, laut einer Dokumentation das folgendermassen schreiben:

Code: Alles auswählen

for L2 = 1 to 0 Step -1
Ich würde das Problem folgendermassen lösen:

Code: Alles auswählen

Sub mein_test
	nochmal:
	K = 1
	sArray = array (rndnumber,rndnumber,rndnumber,rndnumber)
	for L  = 0 to ubound(sArray)
	for L2 = k to ubound(sArray)
		if sArray(L) = sArray(L2) then
		goto nochmal
		endif
	k =  k + 1  
	next L2
	k =  L + 2
	next L	
	s = sArray(0)& "," & sArray(1)& ","& sArray(2)& ","& sArray(3)
msgbox s
end sub
An ein mehrdimensionales Array kann man dann die Werte wie folgt übergeben:

Code: Alles auswählen

Sudokufeld(0,0)=sArray(0)
Sudokufeld(0,1)=sArray(1)
Sudokufeld(1,0)=sArray(2)
Sudokufeld(1,1)=sArray(3)
Das Ganze ist zwar vielleicht etwas umständlich aber dafür übersichtlicher was den Ablauft angeht.
Ein weiterer Vorteil ist, man kann das Array einfach vergrössern ohne an den Schleifen etwas zu ändern
bis auf die Codezeilen

Code: Alles auswählen

intzahl=int((5*rnd))
if intzahl=5 or intzahl=0 then
Gemeint ist hier die "5" die angepasst werden muss.

Schöne Grüsse.

Jürgen

Re: 2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Di, 13.01.2009 11:36
von gurkende_gurke
eine Frage hab ich noch. Mein oo erkennt .sheets häufig nicht. dann muss ich es so lang neustarten bis es wieder funktioniert. irgend eine andere lösung für das problem?

Re: 2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Di, 13.01.2009 12:59
von turtle47
gurkende_gurke hat geschrieben:irgend eine andere lösung für das problem?
Nein, sollte so normalerweise funktionieren.

Aber hier mal was zu Deinem gelöschten Post.

Deine Schleife funktioniert nicht zuverlässig. :(
Wenn Du Dir in Deiner ersten Schleife mal das Ergebnis mittels

Code: Alles auswählen

............
    rem BLNAbbruch wird so lange als falsch definiert, bis alle Zahlen von 1 bis 4 einmal im array vorkommen
    LOOP WHILE BLNAbbruch1=false
    msgbox Feld1(0,0)   & Feld1(1,0)  &  Feld1(0,1)  &  Feld1(1,1)
    exit sub
ansiehst dann, kann das Ganze nicht funktionieren weil Zahlen doch doppelt vorkommen können. :(

An nächster Stelle

Code: Alles auswählen

    ................
       a2Result=FuncAcc.callFunction("countif",array(Feld2,L2))
       az1Result=FuncAcc.callFunction("countif",array(Zeile1,L2))
       az2Result=FuncAcc.callFunction("countif",array(Zeile2,L2))
       msgbox a2Result  &  az1Result   &  az2Result 
exit Sub
       if a2Result <> 1 or az1Result <> 1 or az2Result <> 1 then
rennt sich das Makro zu Tode, weil immer nur "0" ankommt.

Kleiner Tipp > immer die Zwischenergebnisse mittels MsgBox kontrollieren. 8)

Re: 2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Di, 13.01.2009 14:36
von gurkende_gurke
Bei meinem Makro stimmt etwas nicht... vielleicht liegt es auch am code, aber irgendwie will mein openoffice den .sheets(0) befehl nicht akzeptieren...

Code: Alles auswählen

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

Sub ViererSudoku
Dim Doc as Object
Dim Blatt as object
dim Sudokufeld(3,3) as integer
dim Zelle as object
rem definieren der variabeln
nochmal:
K = 1
sArray=array(rndnumber,rndnumber,rndnumber,rndnumber)
for L  = 0 to ubound(sArray)
for L2 = k to ubound(sArray)
	if sArray(L) = sArray(L2) then
		goto nochmal
	endif
k =  k + 1 
next L2
k =  L + 2
next L
Sudokufeld(0,0)=sArray(0)
Sudokufeld(0,1)=sArray(1)
Sudokufeld(1,0)=sArray(2)
Sudokufeld(1,1)=sArray(3)

Sudokufeld(0,2)=rndnumber
Sudokufeld(0,3)=rndnumber
Sudokufeld(1,2)=rndnumber
Sudokufeld(1,3)=rndnumber

Sudokufeld(2,0)=rndnumber
Sudokufeld(2,1)=rndnumber
Sudokufeld(3,0)=rndnumber
Sudokufeld(3,1)=rndnumber

Sudokufeld(2,2)=rndnumber
Sudokufeld(2,3)=rndnumber
Sudokufeld(3,2)=rndnumber
Sudokufeld(3,3)=rndnumber

Doc = ThisComponent
Blatt = Doc.Sheets(0)
rem es wird auf die erste Tabelle des geöffneten Dokuments zugegriffen

for I = LBound(Sudokufeld,1) to UBound(Sudokufeld,1)
	for I1 = LBound(Sudokufeld,2) to Ubound(Sudokufeld,2)
		Zelle = Blatt.getCellbyposition (I,I1)
		Zelle.value = Sudokufeld(I,I1)
	next
next
rem die Werte des Arrays werden auf die Zellen A1:C4 übertragen
end sub

Function rndnumber as integer
dim intzahl as Integer
dim BLNAbbrechen as BOOLEAN
DO
intzahl=int((5*rnd))
if intzahl=5 or intzahl=0 then
	BLNAbbrechen=false else
	BLNAbbrechen=true
endif
LOOP WHILE BLNAbbrechen=false
rndnumber=intzahl
end Function
EDIT: scheint ein bug von oocalc zu sein. Jetzt tuts alles wieder

Re: 2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Di, 13.01.2009 21:01
von gurkende_gurke
das erste problem hab ich gelöst. aber:

"An nächster Stelle

Code: Alles auswählen

    ................
       a2Result=FuncAcc.callFunction("countif",array(Feld2,L2))
       az1Result=FuncAcc.callFunction("countif",array(Zeile1,L2))
       az2Result=FuncAcc.callFunction("countif",array(Zeile2,L2))
       msgbox a2Result  &  az1Result   &  az2Result 
exit Sub
       if a2Result <> 1 or az1Result <> 1 or az2Result <> 1 then
rennt sich das Makro zu Tode, weil immer nur "0" ankommt."

dazu hab ich folgende frage: mit

Code: Alles auswählen


Feld1(0,0)=Zeile1(0,0)
Feld1(0,1)=Zeile1(0,1)
Feld2(0,0)=Zeile1(0,2)
Feld2(0,1)=Zeile1(0,3)

Feld1(1,0)=Zeile2(0,0)
Feld1(1,1)=Zeile2(0,1)
Feld2(1,0)=Zeile2(0,2)
Feld2(1,1)=Zeile2(0,3)
kann ich anscheinend keinen Inhalt von einem Array ins nächste übertragen, da dies dazu führt, dass der inhalt von feld1 und feld2 einfach verloren geht... wie kann ich es dann anstellen, den inhalt eines arrays ins andere zu übertragen?

Re: 2 for-next schleifen genau zur gleichen Zeit ausführen?

Verfasst: Di, 13.01.2009 22:03
von turtle47
gurkende_gurke hat geschrieben:kann ich anscheinend keinen Inhalt von einem Array ins nächste übertragen
Falsche Vermutung. :(

Code: Alles auswählen

Sub Main
Dim Zeile1(1,3) as integer
Dim Feld1 (1,1) as integer
Dim Feld2 (1,1) as integer
	Zeile1(0,0) = rndnumber
	Zeile1(0,1) = rndnumber
	Zeile1(0,2) = rndnumber
	Zeile1(0,3) = rndnumber
	s1 = Zeile1(0,0) & Zeile1(0,1) & Zeile1(0,2) & Zeile1(0,3)
	Feld1(0,0) = Zeile1(0,0)
	Feld1(0,1) = Zeile1(0,1)
	Feld2(0,0) = Zeile1(0,2)
	Feld2(0,1) = Zeile1(0,3)
	s2 =  Feld1(0,0) & Feld1(0,1) & Feld2(0,0) & Feld2(0,1)
	msgbox "Werte aus Array Zeile " & s1 & CHR(13) & CHR(13) & "Werte aus Array Feld " & s2
End Sub