Verständnisproblem 2-dimensionale Arrays

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Richie1984

Betreff: Verständnisproblem 2-dimensionale Arrays

BeitragDi, Apr 19, 2016 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho liebe BB-Gemeinde,
nachdem ich hier schon länger lesend unterwegs bin, stellt sich bei meinen ersten BlitzBasic3D-Versuchen nun ein kleines Verständnisproblem, ich hoffe ihr könnt mir etwas auf die Sprünge helfen.
Es geht um Arrays sowie deren Data- und Read-Befehle.

Bei einem 1-dimensionalen Array ist noch alles klar soweit:

BlitzBasic: [AUSKLAPPEN]
Dim testfeld(5)
Data 0,1,2,3,4,5

For x = 0 To 5
Read testfeld(x)
Next
For x = 0 To 5
Print testfeld(x)
Next

Die erzielte Ausgabe sollte sein:
0
1
2
3
4
5

Bei einem 2-dimensionalen Testfeld müsste ich ja jetzt 2 for-next Schleifen in einander verschachteln, oder?

BlitzBasic: [AUSKLAPPEN]
Dim testfeld(5,5)
Data 0,1,2,3,4,5
Data a,b,c,d,e,f

For x = 0 To 5
For y = 0 To 5
Read testfeld(x,y)
Next
Next
For x = 0 To 5
For y = 0 To 5
Print testfeld(x,y)
Next
Next

Lässt sich das so darstellen? Gewünscht wird in diesem Beispiel die Ausgabe
0a
1b
2c
usw. Das ganze soll später der Koordinatenspeicherung dienen.

Mein grundlegendes Verständnisproblem bezieht sich jetzt vor allem auf die beiden Data-Reihen. Wie muss ich diese beiden Reihen formatieren, so dass immer nacheinander der erste x-Wert und der erste y-Wert etc. kombiniert werden? Wäre es zum Beispiel auch mit "Data 0,1,2,3,4,5,a,b,c,d,e,f" möglich?
Woher weiß der Read-Befehl, wann er welche Stelle der Data-Reihe einlesen soll?

Ich bedanke mich schonmal vorab für eure Hilfe.

Mathias-Kwiatkowski

BeitragDi, Apr 19, 2016 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich benutze nie den "data" befehl da es ebenso einfacher geht grad wenn man eine lade / speicher routine erstellen mag.

mein bsp wäre folgendes:
Code: [AUSKLAPPEN]
Dim Map(2,2)

Map(0,0)=1
Map(0,1)=1
Map(1,2)=1
Map(2,2)=1

For X%=0 To 2
   For Y%=0 To 2
      Print "X="+x+",Y="+y+" Ergebniss:"+Map(x,y)
   Next
Next
      
WaitKey



so gehts auch mit einem 3D Array hier ein bsp
Code: [AUSKLAPPEN]
Dim Map(2,2,1)

Map(0,0,0)=1
Map(0,1,0)=1
Map(1,2,0)=1
Map(2,2,0)=1

Map(1,1,1)=1
Map(1,0,1)=1
Map(1,2,1)=1
Map(2,1,1)=1


For X%=0 To 2
   For Y%=0 To 2
      Print "X="+x+",Y="+y+" Ebene:0 Ergebniss:"+Map(x,y,0)
   Next
Next

      
      
For X%=0 To 2
   For Y%=0 To 2
      Print "X="+x+",Y="+y+" Ebene:1 Ergebniss:"+Map(x,y,1)
   Next
Next
      
WaitKey


Edit : nochmal zu deiner frage
das ist dein bsp code:
Code: [AUSKLAPPEN]
Dim testfeld(5,5)
Data 0,1,2,3,4,5
Data a,b,c,d,e,f

For x = 0 To 5
        For y = 0 To 5
                Read testfeld(x,y)
        Next
Next
For x = 0 To 5
        For y = 0 To 5
                Print testfeld(x,y)
        Next
Next


soetwas geht nicht! soweit ich weiß kann data nur int oder maximal float aber strings glaube ich kaum und wenn sollte es so aussehen "a","b" usw.


woher das read feld weiß wo es ist erklärrt sich ganz einfach
Data 0,1,2,3,4,5
Data 0,1,2,3,4,5
Data 0,1,2,3,4,5

Data 0,1,2,3,4,5
Data 0,1,2,3,4,5
Data 0,1,2,3,4,5

dein dim array gibt vor von 0 zu 5 (6 felder X) und auch ( 6 felder Y )
fehlt in diesem fall eine stelle wird es wohl nich mehr ausgelesen werden können. (geschätzt nicht getestet)

aber empfehlenswert würde ich einfach sagen richte dich an meinen bsp's. glaube das es so ganz gut sein sollte.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Xeres

Moderator

BeitragDi, Apr 19, 2016 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Data Blöcke können auch Texte enthalten, sagt die Hilfe.
Wenn ich mich recht entsinne, kann man bloß keine Variablen/Funktionen/Berechnungen darin unterbringen, weil die eben statisch an die Exe gehangen werden.

Vielleicht macht es in der Praxis kaum einen unterschied, aber die Variablen sollten andersherum durch iteriert werden:
Code: [AUSKLAPPEN]
For y = 0 To 5
        For x = 0 To 5
                Print testfeld(x,y)
        Next
Next

Dann muss nicht so wild im Speicher hin und her gesprungen werden (die Daten liegen linear hintereinander im Speicher, auch wenn das Array mehrere Dimensionen hat).
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Holzchopf

Meisterpacker

Betreff: Re: Verständnisproblem 2-dimensionale Arrays

BeitragDi, Apr 19, 2016 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Richie!

Richie1984 hat Folgendes geschrieben:
Bei einem 2-dimensionalen Testfeld müsste ich ja jetzt 2 for-next Schleifen in einander verschachteln, oder?

Ganz genau. Aber hier kommt der Haken (und da denke ich, tappst du in die Falle):
Deine beiden verschachtelten Schleifen BlitzBasic: [AUSKLAPPEN]
For x = 0 To 5
For y = 0 To 5
Read testfeld(x,y)
Next
Next

Rufen nämlich 6 * 6 = 36 mal Read auf - du stellst aber nur 12x Data zur Verfügung, das wird nicht das gewünschte Ergebnis bringen.

Um deine gewünschte Ausgabe zu erhalten, müsstest du schon mit Types arbeiten oder mit zwei Arrays was zurecht basteln. Halt in der Annahme, dass du effektiv im Sinn hast, zwei unterschiedliche Datentypen (Int und String) in einer Struktur unterzubringen. (Vielleicht wähltest du ja auch nur a,b,c der Verständlichkeit wegen?)
Du bräuchtest in dem Fall auch nicht ein 6x6 Array...

Die Unterbringung in den Data-Reihen könnte dann so aussehen: BlitzBasic: [AUSKLAPPEN]
Data 0, "a", 1, "b", 2, "c"

Alternativ könntest du auch zuerst die Felder 1,2,3... und dann die a,b,c... auslesen, wenn du die Data-Blöcke wie in deinem Post anordnest.

Ach und schau dir mal Restore an Wink

Aber zurück zum Verständnisproblem Rolling Eyes

Richie1984 hat Folgendes geschrieben:
Das ganze soll später der Koordinatenspeicherung dienen.

Bei einem 2D-Array muss das Array selbst nicht der Koordinatenspeicherung dienen. Die Koordinierung übernehmen ja bereits die verschachtelten Schleifen (die eine iteriert in x-, die andere in y-Richtung). Stell dir ein 2D-Array einfach als Stück Karo-Papier vor, dass die Grösse hat, die du mit Dim angibst: Die einzelnen Felder beinhalten dann irgendwelche Daten (typischerweise Ganzzahlen, die etwas repräsentieren) und ansprechen tust du die Felder via meinarray(x,y)

mfG
Holzchopf

Edit
Wenn's wirklich um die Speicherung von Koordinatenpaaren geht, reicht ein Array der Grösse Anzahlpunkte x 2.
2 weil einmal x- und einmal y-Koordinate.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Midimaster

BeitragMi, Apr 20, 2016 8:38
Antworten mit Zitat
Benutzer-Profile anzeigen
für mich sieht das so aus, als wollte Richie mit 1,2,3 und a,b,c nur die beiden Dimensionen verdeutlichen.

Code: [AUSKLAPPEN]
   0  1  2  3  4  5
  ------------------
a| x  x  x  x  x  x
b| x  x  x  x  x  x
c| x  x  x  x  x  x
d| x  x  x  x  x  x
e| x  x  x  x  x  x
e| x  x  x  x  x  x


damit liegst Du mit dem Array testfeld(5,5) schon ganz richtig. Es ist allerdings nicht nötig, die "Bezeichnungen" der Felder einzulesen. Es genügt, deren Inhalt im Datafeld abzulegen:

DataCode: [AUSKLAPPEN]
Data 1,1,1,1,1,1
Data 1,2,0,0,0,1
Data 1,0,2,7,0,1
Data 1,0,0,2,0,1
Data 1,0,0,0,2,1
Data 1,1,1,1,1,1


ergibt zum Beispiel solch ein Spielfeld:

Code: [AUSKLAPPEN]
   0  1  2  3  4  5
  ------------------
a| 1  1  1  1  1  1
b| 1  2           1
c| 1     2  7     1
d| 1        2     1
e| 1           2  1
e| 1  1  1  1  1  1



Dass heißt, ein Array-Element z.b. testfeld(2,3) spiechert nicht einen X und einen Y-Wert, sondern nur einen "Inhaltswert" z.b. "7" an der Position 2/3. Ein vollständiges DATA-Feld bräuchte daher 36 Einträge

Alternative:
willst Du ein DATA-Feld, bei dem jeweils die drei Informationen X-Koordinate, Y-Koordinate und deren Inhalt eingelesen werden sollen, so könntenst Du das so machen:
Code: [AUSKLAPPEN]

Dim testfeld(5,5)

; Data-Struktur: X , Y , Inhalt
Data 0, 0, 1
Data 2, 2, 2
Data 2, 3, 7
...usw

For i = 1 To 3   ; abhängig von der Anzahl der Zeilen
       Read x
       Read y
       Read testfeld(x,y)
Next

For x = 0 To 5
        For y = 0 To 5
                Print testfeld(x,y)
        Next
Next
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

Richie1984

BeitragMi, Apr 20, 2016 8:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen lieben Dank für eure sehr ausführlichen und hilfreichen Antworten. ihr habt mir sehr weitergeholfen.
Mit 1,2,3 und a,b,c wollte ich tatsächlich nur die beiden Dimensionen verdeutlichen.

Der elementare Denkfehler war tatsächlich, dass ich davon ausging dim blabla(5,5) erzeuge ein Feld mit 2 Spalten a 6 Feldern. Da es tatsächlich ja aber 6*6 Felder sind, hat das logischerweise nie geklappt mit dem einlesen.

Geplant war, über diese Methode eine Art Arena zu definieren, wobei in diesem Feld die X,Y,Z Koordinaten der 4 Wände und des Bodens abgelegt und ausgelesen werden können.
Ich glaube aber mittlerweile, dass es für mein ordinäres erstes Szenario deutlich weniger umständlich ist, die 4 Wände manuell zu platzieren Very Happy

Aber nochmal vielen vielen Dank, nun habe ich die dämlichen Arrays endlich so halbwegs kapiert Wink

Ich werde euch sicher noch öfters mit Noob-Fragen beschäftigen Question

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group