Problem: Durchmischen eines zweidimensionalen Arrays

Anfängerfragen zum Programmieren mit PureBasic.
heinz.goldbach
Beiträge: 93
Registriert: 16.11.2005 18:27
Wohnort: Neuss

Problem: Durchmischen eines zweidimensionalen Arrays

Beitrag 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
---------------------------------------------------
Man lernt nur aus Fehlern!
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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
heinz.goldbach
Beiträge: 93
Registriert: 16.11.2005 18:27
Wohnort: Neuss

Beitrag 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?
---------------------------------------------------
Man lernt nur aus Fehlern!
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

in PB4 musst du Global Dim Karten.l(#Anzahl_Fragen) schreiben.
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Beitrag von Sylvia »

'Global Dim Karten()' ist dein Freund
Basic Pur = PureBasic
heinz.goldbach
Beiträge: 93
Registriert: 16.11.2005 18:27
Wohnort: Neuss

Beitrag 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.
---------------------------------------------------
Man lernt nur aus Fehlern!
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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" ;)
heinz.goldbach
Beiträge: 93
Registriert: 16.11.2005 18:27
Wohnort: Neuss

Beitrag von heinz.goldbach »

Bei zweidimensionalen Arrays geht es leider nicht.
---------------------------------------------------
Man lernt nur aus Fehlern!
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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)
heinz.goldbach
Beiträge: 93
Registriert: 16.11.2005 18:27
Wohnort: Neuss

Beitrag 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.
---------------------------------------------------
Man lernt nur aus Fehlern!
Antworten