Seite 1 von 2

Problem: Durchmischen eines zweidimensionalen Arrays

Verfasst: 07.03.2006 16:24
von heinz.goldbach
Habe ein Arrayproblem, das ich leider nicht gelöst bekomme.
Evtl. hat da jemand eine Idee.
Nun zum Array

Die Dimensionierung sieht z. b so aus:

Dummy.s(2,10) ; als Dummy Array
Dim Block1.s (100,6) ; In dem Array sind z. B. 100 Fragen
Block1.s(0,0)= "100" ;Anzahl der Fragen von Block 1
Block1.s(0,1)="6" ;Felder pro Array


Aufbau des Arrays Beispielhaft
Block1.s (AnzahlderFragen,1) ist die Frage als String
Block1.s (AnzahlderFragen,2..5) sind vier mögliche Antworten als String
Block1.s (AnzahlderFragen,6) ist die richtige Antwort numerisch als String

Das durchmischen der Fragen habe ich wie unten aufgeführt gelöst.
Das Problem bei dieser Lösung ist jedoch, das einige Fragen mehrfach vorkommen können.
Dies sollte jedoch ausgeschlossen sein. Hat da evtl. jemand noch eine Idee wie man das richtig hinkriegt? Nachdem das Durchmischen fertig ist, kann man zwar prüfen, ob Fragen öfter vorhanden sind. Bei grösseren Arrays wird das aber sehr langsam.

Code: Alles auswählen

For z.b= 1 To 100 ; 100 mal mischen
  Repeat : x=Random(AnzahlDerFragen.b-1)+1 : y=Random(AnzahlDerFragen.b-1)+1 : Until x <> y ; Holt x und Y Zufallszahlen
  For w = 0 To  Val(Block1.s(0,1))
    dummy.s(1,w)=Block1.s(x,w)
    dummy.s(2,w)=Block1.s(y,w)
  Next w
  For w = 0 To  Val(Block1.s(0,1))
    Block1.s(x,w)=dummy.s(2,w)
    Block1.s(y,w)=dummy.s(1,w)
  Next w
Debug x
Next z.b

Verfasst: 07.03.2006 17:37
von HeX0R
Bei einem Kartenspiel hatte ich das mal so gemacht:

Code: Alles auswählen

#Anzahl_Fragen = 20

Dim Karten.l(#Anzahl_Fragen)

Procedure MischeKarten()
	
	
	
	If Karten(1) = 0
		;Initialize Karten
		For i = 1 To #Anzahl_Fragen
			Karten(i) = i
		Next i
	EndIf
	
	;Mischen... so etwa 200mal...
	
	For i = 0 To 200
		
		;Wir suchen zwei zufällige unterschiedliche Zahlen zwischen 1 und #Anzahl_Fragen
		random1 = 0
		random2 = 0
		
		While random1 = random2
			random1 = Random(#Anzahl_Fragen - 1) + 1
			random2 = Random(#Anzahl_Fragen - 1) + 1
		Wend
		
		;Wir vertauschen die beiden gefundenen Positionen
		j = Karten(random2)
		Karten(random2) = Karten(random1)
		Karten(random1) = j
		
	Next i
	
EndProcedure

MischeKarten()

For i = 1 To #Anzahl_Fragen
	Debug Karten(i)
Next i

Verfasst: 07.03.2006 18:04
von heinz.goldbach
Läuft prima unter PB 3.94.
Unter PB 4 B5 kommt die Fehlermeldung für Zeile 9:
Karten() ist not a function, array or a linked list.
Arrays sind doch auch bei PB 4 immer global. Bisher gab es noch keine Probleme, oder liegt es an der Konstanten? Verstehe ich irgendwie nicht?

Verfasst: 07.03.2006 18:06
von HeX0R
in PB4 musst du Global Dim Karten.l(#Anzahl_Fragen) schreiben.

Verfasst: 07.03.2006 18:08
von Sylvia
'Global Dim Karten()' ist dein Freund

Verfasst: 07.03.2006 18:11
von heinz.goldbach
Danke so klappt es.
In der deutschen Vorabhilfe von PB 4 steht zu dem DIM Befehl:

Arrays in PureBasic sind immer global verfügbar. Dies bedeutet, dass auf sie auch aus Prozeduren heraus zugegriffen werden kann, ohne die Befehle Global oder Shared aufrufen zu müssen.

Verfasst: 07.03.2006 18:12
von HeX0R
Schlafmütze @Sylvia :mrgreen:

in PB4 kannst du sogar das Vertauschen vereinfachen durch:

Code: Alles auswählen

Swap Karten(random1), Karten(random2)
[Edit]
Naja, die deutsche Hilfe ist da nicht ganz up-to-date, deswegen auch "Vorab" ;)

Verfasst: 07.03.2006 18:16
von heinz.goldbach
Bei zweidimensionalen Arrays geht es leider nicht.

Verfasst: 07.03.2006 18:33
von HeX0R
Findest du das nicht etwas verwirrend mit dem mehrdimensionalen Array ?

Was hältst du denn von Strukturen :

Code: Alles auswählen

Structure _QUIZ_
	Frage.s
	Moegliche_Antworten.s[5]
	Loesung.s
EndStructure

#Anzahl_Fragen = 20

Global Dim Quiz_Fragen._QUIZ_(#Anzahl_Fragen)

Verfasst: 07.03.2006 18:42
von heinz.goldbach
Die Idee mit den Strukturen ist mir erst gekommen, als ich so ziemlich alles fertig hatte. Im nachhinein wäre es wesentlich besser gewesen. Eine Änderung ist nun leider fast unmöglich, da alles auf Arraybasis läuft.