Type-Array als Field?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

gekkonier

Betreff: Type-Array als Field?

BeitragMi, März 26, 2008 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich habe folgenden Code:

Code: [AUSKLAPPEN]
SuperStrict

Type Feld
   Field color:Int
   Field status:Int
End Type

Type Matrix
   Field data:Feld[10, 10]
   Method New()
      ' Wie initialisiere ich hier das Array korrekt?
   End Method
End Type

Local m:Matrix = New Matrix

m.data[0, 0].color = 10


Wenn ich jetzt das Ding kompiliere kommt als Fehler zur letzten Zeile
Code: [AUSKLAPPEN]
Unhandled Exception:Attempt to access field or method of Null object
, was mich vermuten lässt, dass ich das Array nach der Deklaration initialisieren muss. Quasi so wie hier:

Code: [AUSKLAPPEN]
SuperStrict

Type Feld
   Field color:Int
   Field status:Int
End Type

Type Matrix
   Field data:Feld
   Method New()
      data:Feld = New Feld
   End Method
End Type

Local m:Matrix = New Matrix

m.data.color = 10


Wie macht man das mit ein oder mehrdimensionalen Arrays?
Gibt es dazu etwas was ich in der Hilfe übersehen hätte? Ich hab alles mögliche schon ausprobiert, aber meistens ganz üble Fehler bekommen (Falsche Array Dimensionen, Null-Referenzen und weiss der Geier Wink )

Danke im Voraus, Gekko
 

ChristianK

BeitragMi, März 26, 2008 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich wollte ich das hier als Lösung posten:

Code: [AUSKLAPPEN]
Type Matrix
   Field data:Feld[,]
   
   Method New()
      data = New Feld[10,10]
   End Method
End Type

Nur kommt der Fehler bei mir nicht. Sollte er aber, oder hab ich was übersehen? Confused
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

gekkonier

BeitragMi, März 26, 2008 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man das alleine so stehen lasst funktioniert das ja auch, wenn ich dann allerdings das Ding verwenden will, ala:
Code: [AUSKLAPPEN]
Local m:Matrix = New Matrix
m.data[0, 0].color = 1


Bekomme ich:
Code: [AUSKLAPPEN]
Unhandled Exception:Attempt to access field or method of Null object


So vertraut mit der Syntax von Bmax bin ich noch nicht Wink

FOODy

BeitragMi, März 26, 2008 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@ChristianK:
So erstellt man nur ein Array, aber nicht die Objekte selber.
( Im Debug-Modus kommt die Fehlermeldung wegen dem Null-Objekt )

@gekonnier:
Es ist ganz simpel.
Dynamische Initialisierungs-Lösung wäre:
Code: [AUSKLAPPEN]
Type Matrix
   Field data:Feld[10, 10]
   Method New()
   Local dims:Int[]=data.dimensions()
   For Local x:Int=0 Until dims.length
      For Local y:Int=0 Until dims[x]
         data[x,y]=New Feld
      Next
   Next
   End Method
End Type


und die statische:
Code: [AUSKLAPPEN]
Type Matrix
   Field data:Feld[10, 10]
   Method New()
   For Local x:Int=0 Until 10
      For Local y:Int=0 Until 10
         data[x,y]=New Feld
      Next
   Next
   End Method
End Type


Dürfte eigentlich selbsterklärend sein?

Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

gekkonier

BeitragMi, März 26, 2008 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha, das bedeutet, dass ich jedes Objekt quasi "manuell" anlegen muss.
Danke für die Information!

d-bug

BeitragMi, März 26, 2008 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
*oops, falsch gelesen... sorry*

cheers

FOODy

BeitragMi, März 26, 2008 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
d-bug hat Folgendes geschrieben:
Ähm entschuldigt die Einmischung, aber bei einem statischen Array genügt folgendes völlig.

Code: [AUSKLAPPEN]
Type Matrix
   Field data:Int[10, 10]
End Type


cheers


Bei Datentypen ja, aber nicht bei Type's bzw Objekten.
( Wenn der Mensch, wie es in diesem Falle ist, die Objekte dort auch "sofort" haben möchte )


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

ChristianK

BeitragMi, März 26, 2008 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
@FOODy
ja, das ist mir schon klar. Mich wundert aber, dass der Fehler nur im Debug-Modus erkannt wird. Im Release-Build funktioniert das hier:

Code: [AUSKLAPPEN]
SuperStrict
Framework brl.standardio

Type Test
   Field hi:Int
End Type

Local x:Test
x.hi = 123

Print x.hi
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

FOODy

BeitragMi, März 26, 2008 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@ChristianK:
Im Release ist das mehr oder weniger eine "Glückssache".
Bei mir ist der Fehler auch nur im Debugmodus gekommen, was warscheinlich auch daran liegt das geprüft wird ob das Objekt auf einen gültigen speicherbereich "zeigt" etc.

Gruß,
FOODy


EDIT:
d-bug hat Folgendes geschrieben:
FOODy hat Folgendes geschrieben:
d-bug hat Folgendes geschrieben:
Blablubblapper


Bei Datentypen ja, aber nicht bei Type's bzw Objekten.
( Wenn der Mensch, wie es in diesem Falle ist, die Objekte dort auch "sofort" haben möchte )


Gruß,
FOODy


Na deswegen hatte ich ja auch schon VOR deinem Post meinen gelöscht. Ich hatte mich schlichtweg verlesen!


Ich wollte dich damit nicht angreifen.
Es darf doch mal passieren, dass ich dein Edit erst nachdem ich auf Absenden gedrückt habe bemerke. ;)
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
  • Zuletzt bearbeitet von FOODy am Mi, März 26, 2008 21:28, insgesamt einmal bearbeitet

gekkonier

BeitragMi, März 26, 2008 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ists im Prinzip besser es so, wie von FOODy vorgeschlagen anzuwenden, um etwaigen Problemen aus dem Wege zu gehen.
Praktikabler wärs zwar, wenn man das wie bei normalen Datentypen verwenden könnte, aber so kann ich auch damit leben Very Happy

d-bug

BeitragMi, März 26, 2008 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
FOODy hat Folgendes geschrieben:
d-bug hat Folgendes geschrieben:
Blablubblapper


Bei Datentypen ja, aber nicht bei Type's bzw Objekten.
( Wenn der Mensch, wie es in diesem Falle ist, die Objekte dort auch "sofort" haben möchte )


Gruß,
FOODy


Na deswegen hatte ich ja auch schon VOR deinem Post meinen gelöscht. Ich hatte mich schlichtweg verlesen!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group