[Monkey] Arrays - seltsamer Fehler

Übersicht Andere Programmiersprachen Beginners-Corner

Neue Antwort erstellen

Tennisball

Betreff: Arrays - seltsamer Fehler

BeitragSo, März 13, 2011 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe schon etwas mit der Demo herumgespielt und habe ein ominöses Problem mit den Arrays:

Code: [AUSKLAPPEN]
Class MyGame Extends App
   
   Field testarray:=[New Int[3], New Int[4]]
   
   
   Method OnCreate ()
      
      testarray[2][2] = 5         '<- genau hier kommt ein Fehler "Array index out of range"
      
   End

   
   Method OnUpdate ()
      
   End
   
   
   Method OnRender ()
      
      Print testarray[2][2]
      
   End
   
End


Wisst ihr, wie man das beheben könnte?

mfg,
Tennisball

coolo

BeitragSo, März 13, 2011 11:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Da Arrays in Monkey sehr rudmentär vorhanden sind, muss man sich das Dimensionieren selber Programmieren:

BlitzMax: [AUSKLAPPEN]
Function IntArray2D:Int[][] (X%,Y%)
Local tmp:Int[X][]
For Local I% = 0 Until X
tmp[I] = New Int[Y]
Next
Return tmp
End Function
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat
  • Zuletzt bearbeitet von coolo am So, März 13, 2011 11:46, insgesamt einmal bearbeitet

Lobby

BeitragSo, März 13, 2011 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
So ominös finde ich dieses Problem gar nicht, denn wie in BlitzMax geht der Index von Arrays von 0 bis zur Anzahl der Felder -1. Dein testarray hat genau zwei Felder (welche jeweils einmal mit New Int[3] und einmal mit New Int[4] gefüllt sind). Aus diesem Grund muss der Zugriff auf testarray[2] fehlschlagen. Wenn Du die 2 durch eine 0 oder eine 1 ersetzest, so wird dein Code funktionieren Wink .

Hier nocheinmal der damit verbesserte, vollständige Code, nur um weitere Fehler auszuschließen:
BlitzMax: [AUSKLAPPEN]
Import mojo

Class MyGame Extends App

Field testarray:=[New Int[3], New Int[4]]


Method OnCreate ()

testarray[1][2] = 5 '<- genau hier hast Du zuvor auf ein nicht existierendes testarray[2][...] zugegriffen!

End


Method OnUpdate ()

End


Method OnRender ()

Print testarray[1][2] '<- Hier ebenfalls, aber das wäre ja nun behoben

End

End

Function Main:Void()
New MyGame
End Function


Coolo, sofern Du Monkey und nicht BlitzMax meinst, hast Du die Arrays betreffend selbstverständlich recht.

coolo

BeitragSo, März 13, 2011 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Lobby: Tennisballs Ansatz sollte genau so funktionieren, ist jedoch ein Bug, dass es nicht funktioniert. Siehe: http://www.monkeycoder.co.nz/C...?topic=215 .
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

Lobby

BeitragSo, März 13, 2011 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Als Bug würde ich das nicht bezeichnen, im Gegenteil, alles andere wäre wohl ein Bug, warum aber mark das selbst nicht zu verstehen scheint ist mir ein Rätsel. Tennisballs erster Ansatz könnte auch so umgeschrieben werden, um das zu verdeutlichen:
BlitzMax: [AUSKLAPPEN]
Class MyGame Extends App 

Field testarray:=New Int[2][]


Method OnCreate ()
testarray[0]=New Int[3]
testarray[1]=New Int[4]
testarray[2][2] = 5 '<- genau hier kommt ein Fehler "Array index out of range", da testarray nur eine Länge von 2 hat

End


Method OnUpdate ()

End


Method OnRender ()

Print testarray[2][2]

End

End
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Tennisball

BeitragSo, März 13, 2011 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

also irgendwie sind das dann keine richtigen Arrays, wie in BlitzMax z.B. ?!
Dann werd ich das wohl irgendwie anders zusammenbasteln müssen.

mfg,
Tennisball

BladeRunner

Moderator

BeitragSo, März 13, 2011 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Es sind richtige Arrays, Du musst sie nur selbst initialisieren Wink
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

Midimaster

BeitragSo, März 13, 2011 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Tennisball,

der Weg, den Dir coolo aufzeigt ist genau das, was Du suchst. Lobby zeigt zwar auf, warum Deine Schreibweise nicht funzt, verwirrt aber mehr als er nützt. Am Ende des Threads wirkt es so, als müsse man bei mehrdimensionalen Array in MONKEY kapitulieren.


Da dieses Problem sicherlich noch viele Leute mehr interessieren wird, verdeutliche ich jetzt noch einmal den Lösungsweg:


Zunächst das FAZIT vorneweg, für alle, die es gar nicht so genau wissen wollen:

BlitzMax: [AUSKLAPPEN]
Global a:Int[15,9]
...in BlitzMax wird in Monkey zu.... BlitzMax: [AUSKLAPPEN]
 Global a:Int[][] =IntArray2D(15,9)

...wobei diese Funktion an den eigenen Code anzuhängen ist:
BlitzMax: [AUSKLAPPEN]
Function IntArray2D:Int[][] (X%,Y%)
Local tmp:Int[X][]
For Local I% = 0 Until X
tmp[I] = New Int[Y]
Next
Return tmp
End Function


So nun noch die Beschreibung:

BlitzMax: [AUSKLAPPEN]
Global a:Int[15,9]

...erstellte in BMax ein Feld mit 15x9 Elementen von a[0,0] bis a[14,8]. Anschließend konnte man es gleich verwenden:
BlitzMax: [AUSKLAPPEN]
a[3,3]=345


In MONKEY wird durch den Befehl...BlitzMax: [AUSKLAPPEN]
 Global a:Int[][]
...zwar auch ein mehrdimensionales Array erstellt, aber jetzt muss man erst jedes einzelne Elemente darin erzeugen:
BlitzMax: [AUSKLAPPEN]
	Local a:Int[15][]
Die erste Dimension kann in einem Zug erstellt werden. Sie enthält dann 15 Elemente, die jedes für sich aber noch keine Unterelemente enthalten.

BlitzMax: [AUSKLAPPEN]
	Local a:Int[15][]
For Local I% = 0 Until 15
a[I] = New Int[9]
Next
Mit der For/Next-Schleife werden nun alle 15 mit jeweils einem 9-elementigen Array gefüllt.

Coolo's Funktion vereinfacht nun diese Arbeit indem sie uns eine Funtion zur Verfügung stellt, die genau dem alten BMax-Befehl entspricht:
BlitzMax: [AUSKLAPPEN]
Import mojo

Class ErstesSpiel Extends App
Global myarray:Int[][] =IntArray2D(15,9)

Method OnCreate% ()
myarray[4][3]=20
myarray[0][1]=30
Return 0
End
Method OnUpdate% ()
Return 0
End

Method OnRender% ()
DrawText myarray[4][3],100,100
Return 0
End
End

Function Main% ()
New ErstesSpiel
Return 0
End

Function IntArray2D:Int[][] (X%,Y%)
Local tmp:Int[X][]
For Local I% = 0 Until X
tmp[I] = New Int[Y]
Next
Return tmp
End Function

tft

BeitragSa, März 19, 2011 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich würde sagen ..... sogar ich habe das verstanden ......... ist doch aber alles andere als einfach und intuitiv. Wird Monky sich eher an C++ orientieren?

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group