[Monkey] Mehrdimensionale Arrays. Index out of Bonds

Übersicht Andere Programmiersprachen Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Mehrdimensionale Arrays. Index out of Bonds

BeitragSo, März 09, 2014 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitzer,

warum ??

Code: [AUSKLAPPEN]

Global aTile_Map:=[New Int[99], New Int[99]]


erstellt einen Mehrdimensionalen Array.
Quelle: http://www.monkeycoder.co.nz/C...?topic=162

Code: [AUSKLAPPEN]

'Main Game...

   Method OnCreate:int()
   
      For Local y:Int = 0 To 10
         For Local x:Int = 0 To 10
            aTile_Map[x][y] = 0
         Next
      Next
      
      
   Return (0)
   End


Führt zu einem Indexfehler im Array. Ist für mich nicht nachvollziehbar.
Warum ?

ich Gehe gerade die Samples durch und finde so etwas:
(Scheinbar wird alles in einen 1 dimensionalen Arry gestopft und anhand der MapSize_X der Umbruch in der Y Achse vorgenommen... Ernsthaft ??
Code: [AUSKLAPPEN]

Local level:Int[] = [
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            15,15,15,15, 4, 9, 0, 9, 4,15,15,15,15,
             4, 4, 4, 4, 4, 9, 0, 9, 4, 4, 4, 4, 4,
            12,12,12,12,12, 9, 0, 9,12,12,12,12,12,
             7, 7, 7, 7, 7, 9, 0, 9, 7, 7, 7, 7, 7,
             5,15, 5,15, 5, 9, 0, 9, 5,15, 5,15, 5,
             7,15, 7,15, 7, 9, 0, 9, 7,15, 7,15, 7,
             4, 4,15, 4, 4, 9, 0, 9, 4, 4,15, 4, 4,
             3,15, 3,15, 3, 9, 0, 9, 3,15, 3,15, 3,
             6,15, 6,15, 6, 9, 0, 9, 6,15, 6,15, 6,
             3, 3, 3, 3, 3, 9, 0, 9, 3, 3, 3, 3, 3]
         CopyBoard(level)
  • Zuletzt bearbeitet von Dottakopf am So, März 09, 2014 21:22, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragSo, März 09, 2014 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe kein Monkey und kan nur raten, aber es sieht mir hier so aus als ob Du nicht ein Array of Arrays erstellst [][], sondern ein mehrdimensionales Array [,].
Und dann geht der Zugriff natürlich hoch.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

ZEVS

BeitragSo, März 09, 2014 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Monkey in diesem Zusammenhang in etwa wie BlitzMax funktioniert, erzeugst du ein mehrdimensionales Array (bzw. eher ein Array von Arrays), welches in der ersten Dimension zwei und in der zweiten 99 oder 100 (bei Monkey kenne ich mich da nicht aus) groß ist. Bei BlitzMax erzeugt z.B. BlitzMax: [AUSKLAPPEN]
Global a:Int[] = [2,3,4]
ein Array von drei Integern, entsprechend erzeugt BlitzMax: [AUSKLAPPEN]
[ New Int[99], New Int[99] ]
ein Array von zwei Integer-Arrays.
Weil du bis 10 iterierst, kommt es zum Fehler.

ZEVS

Dottakopf

BeitragMo, März 10, 2014 10:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Äh Embarassed also was ist jetzt die Lösung ?

Code: [AUSKLAPPEN]

Global aTile_Map:Int[] =[10, 10]


erstellt ein eindimensionales Array mit den Indizies: 0=10 1 = 10 auf das ganz normal zugegriffen werden kann.

ich habe auch verstanden das [ New Int[99], New Int[99] ] zwei arrays im Array mit den Indizies 0 - 1 erstellt.

nur wie funtzt jetzt ein ganz normaler 2 Dimensionaler Array? So Komplex ist das doch garnicht.
bzw. wie funtkioniert der korrekte zugriff auf "[ New Int[99], New Int[99] ]"

Bitte entschuldigt wenn ich so plump frage aber ich verstehe den Zugriff nicht.

~Edit~
gerade habe ich das gebastelt und es funtz.. nur ist da auch "Geschickt so"
Code: [AUSKLAPPEN]

'2 Dimensonalen Array erstelln
Global aTile_Map:int[30][]


Code: [AUSKLAPPEN]

'Array 2 Dimension erstellen bzw. erste Dimenson definieren..
For Local x:int = 0 To 29
      aTile_Map[x] = New Int[30]
Next


Code: [AUSKLAPPEN]

'Nun den 2 Dimensionalen Array wie gewohnt befüllen
For Local x:int = 0 To 29
      For Local y:Int = 0 To 29
         aTile_Map[x][y] = 1
      Next
Next


ist das so sinnvoll ? oder gehts irgendwie cooler --> ja ich bin ein noob ^^
 

PhillipK

BeitragMo, März 10, 2014 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@DottaKopf:
Das ist leider auch die einzige variante, wie ich je Arrays erstellen konnte.

Allerdings kann man das ganze dafür auch "Auslagern" in eine Hilfsklasse. Denn: Monkey unterstützt Generics ^^

Fakt ist: Mehrdimensionale Arrays gibt es nichtmehr. Array of Arrays oder eben garnichts Sad

Folgender Code:
Code: [AUSKLAPPEN]

Strict

Class Generics<T>
   
   Function CreateArray1D:T(indices:Int)
      Return New T[indices]
   End
   Function CreateArray2D:T[][](indices1:Int, indices2:Int)
      Local tmp:T[][]
      tmp = tmp.Resize(indices1)
      
      For Local i:Int = 0 Until indices1
         tmp[i] = tmp[i].Resize(indices2)
      Next
      
      Return tmp
      
   End
   Function CreateArray3D:T[][][] (indices1:Int, indices2:Int, indices3:int)
      Local tmp:T[][][]
      
      tmp = tmp.Resize(indices1)
      
      For Local i:Int = 0 Until indices1
         tmp[i] = Generics<T>.CreateArray2D(indices2, indices3)
      Next
      Return tmp
   End
End


Schafft aber abhilfe.

Aufzurufen ist das ganze so:

Code: [AUSKLAPPEN]
Local arr:Int[][] = Generics<Int>.CreateArray2D(10, 10)

Code: [AUSKLAPPEN]
Local arr:Float[][] = Generics<Float>.CreateArray2D(10, 10)

Code: [AUSKLAPPEN]
Local arr:String[][] = Generics<String>.CreateArray2D(10, 10)

Code: [AUSKLAPPEN]
Local arr:Object[][] = Generics<Object>.CreateArray2D(10, 10)

Code: [AUSKLAPPEN]
Local arr:Image[][] = Generics<Image>.CreateArray2D(10, 10)

Code: [AUSKLAPPEN]
Local arr:Byte[][] = Generics<Byte>.CreateArray2D(10, 10)



Ich meine mich zu erinnern, das mich das anfangs auch ziemlich angekotzt hat.
Aber naja, da will man mal nicht meckern - jede sprache hat doch irgendwie ihre macken..

Nebenbei:
Code: [AUSKLAPPEN]

Class Generics<T>
zeigt, das diese Klasse Generisch ist. Das heißt, du musst "T" genauer definieren - das tut man direkt über die typenbezeichnung.
Intern wird beim compilen für jeden angeforderten typ T eine eigene klasse hiervon gebastelt - wie effizient das geschieht weiß ich leider nicht.
Allerdings hilft uns das bei dem Arrayproblem ungemein: So hast du die möglichkeit, für jeden gegenwärtigen und zukünftigen Typ den du in deinem Projekt verwendest einen Array zu erstellen.


Edit:
[quote=Dottakopf]
'2 Dimensonalen Array erstelln
Global aTile_Map:int[30][][/quote]

huch, das kannte ich so noch garnicht o.O
Mal testen, das könnte meiner faulheit helfen^^

Dottakopf

BeitragMo, März 10, 2014 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey die Classe ist ja super!

den im Moment habe ich das Problem das ich den ersten Indizie nicht dynamisch hinbekomme.
Alles in allem werde ich um die Klasse die mir n 2D Array baut nicht umher kommen.

Danke !.. wirklich super !

Warum zum geier wird das eigentlich in keinem der ersten Tutorials oder Samples in Monkey gezeigt.
*Seufz..*
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group