(Gelöst) Problem mit dem Auslesen mehrdimensionaler Arrays

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

KarlosKojote

Betreff: (Gelöst) Problem mit dem Auslesen mehrdimensionaler Arrays

BeitragSo, Okt 31, 2010 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Ich versuche grade Tutorials die eigentlich für Flash sind in BlitzMax anzuwenden. Hierbei habe ich allerdings zwei Probleme.
1. Wieso ist das Array +1 größer als es wirklich ist, so das man immer -1 bei der For...Next Schleife anwenden muss?
2. Wieso bekomme ich eine Fehlermeldung wenn ich das ganze Ausführe? Ich müsste in den Schleifen -3 angeben, dann funktioniert es, was ja aber nicht der Sinn sein sollte, da muss ich ja irgendwas falsch gemacht haben!?

Kann mir jemand erklären was ich falsch gemacht habe?
Vielen Dank Smile

Code: [AUSKLAPPEN]

Local myMap:Int[][] = [ [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1] ]

Local mapWidth:Int = myMap[0].length
Local mapHeight:Int = myMap.length

Print mapWidth+":"+mapHeight

For y = 0 To mapHeight-1
   For x = 0 To mapWidth-1
      Print myMap[x][y]
'      Print x+":"+y
   Next
Next
  • Zuletzt bearbeitet von KarlosKojote am Mo, Nov 01, 2010 18:03, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Okt 31, 2010 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze einfach Until statt to Wink
Code: [AUSKLAPPEN]
For y = 0 Until mapHeight
   For x = 0 Until mapWidth
      Print myMap[x][y]
'      Print x+":"+y
   Next
Next
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)

M2M

BeitragMo, Nov 01, 2010 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Programmierung ist es üblich, anders als im echten Leben, von 0 an zu zählen. Darum enthält das Array Kisten[3] die Werte 0,1,2,3 und hat somit 4 Einträge (0 - 3).

FireballFlame

BeitragMo, Nov 01, 2010 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, hat es nicht.

Array-Indizes gehen von 0 bis Arraygröße-1.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

M2M

BeitragMo, Nov 01, 2010 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach, und wieso führt dann folgender Code

Code: [AUSKLAPPEN]

Local array[3]
For i = 0 To 3
  Print array[i]
Next


zur Ausgabe:
0
0
0
0

?

mpmxyz

BeitragMo, Nov 01, 2010 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bekomme die "Ausgabe" "Unhandled Exception: Attempt to index array element beyond array length".
Nun gibt es zwei Möglichkeiten, wie du auf dein Ergebnis kommst:
1. Du bist nicht bei BlitzMax.
2. Der Debugger ist deaktiviert.
Edit:
Des Rätsels Lösung:
Du hast die Indizes vertauscht.
BlitzMax: [AUSKLAPPEN]

Local mapWidth:Int = myMap[0].length '<-zweiter Index: x
Local mapHeight:Int = myMap.length '<-erster Index: y

For y = 0 Until mapHeight
For x = 0 Until mapWidth
Print myMap[y][x]
' Print x+":"+y
Next
Next

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
  • Zuletzt bearbeitet von mpmxyz am Mo, Nov 01, 2010 12:20, insgesamt einmal bearbeitet
 

n-Halbleiter

BeitragMo, Nov 01, 2010 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm... BMax und BB haben unterschiedliches Arrayverhalten. Dein Code, M2M, ist für BB. In BMax ist ein Array[3] 3 Einträge groß, und geht nicht einschließlich bis zum Index 3, wie in BB. So zur Info. Wink

EDIT: @mpmxyz, dann würde aber nicht zwangsläufig 0 als letztes Ergebnis herauskommen. Bei mir kommt da "77333713" raus.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

DaysShadow

BeitragMo, Nov 01, 2010 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code funktioniert, auch mit SuperStrict, aber nur im Release-Modus.
Man kann die 3 auch gegen eine 100 austauschen und es geht, es wird einfach nur der Inhalt des Pointers abgefragt und den schiebt man halt einfach weiter wenn man einen höheren Index abfragt.
Gibt dann halt kauderwelsch^^

BlitzMax: [AUSKLAPPEN]
SuperStrict

Local array:Int[3]

For Local i:Int = 0 To 100
Print "Value of " + i + ": " + array[i]
Print "Adress of " + i + ": " + Int( Varptr array[ i ] ) + "~n" 'Immer 4 Byte weiter...

Next
Blessed is the mind too small for doubt
 

KarlosKojote

BeitragMo, Nov 01, 2010 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso ok, Array.length gibt also immer die tatsächliche Größe aus und deswegen muß ich Array.length-1 für den Index nehmen... Klingt auch logisch, aber darauf wär ich so jetzt trotzdem nicht gekommen *g*

@DaysShadow: Das führt mit "Glück" dann wahrscheinlich, wie in C, zu den faszinierensten Ergebnissen xD

@mpmxyz: Danke so funktioniert es. Ich habs in der Tat wirklich nur verwechselt.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group