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:
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
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.

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