BlitzMax Types und C++ Klassen
Übersicht

ChristianKBetreff: BlitzMax Types und C++ Klassen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich schreibe gerade eine DLL, die BlitzMax-Types mit Daten füllt. In etwa so:
Code: [AUSKLAPPEN] Type TTest
Field daten1:Int Field daten2:Float End Type Global MeineFunktion:TTest( parameter:Int ) = GetProcAddress( dll, "MeineFunktion" ) Local test:TTest = MeineFunktion( 123 ) Das funktioniert auch so, wie ich es haben will, solange die Funktion aus der DLL erfolgreich ausgeführt wird. Ich möchte nämlich, dass wenn ein falscher Parameter übergeben wird, die Funktion 0 zurückgibt. Hier der C++ Code: Code: [AUSKLAPPEN] extern "C" _declspec( dllexport ) TTest* MeineFunktion( Int parameter )
{ TTest* test; if( parameter == 123 ) { return 0; } else { test = new TTest; return test; } } TTest wird natürlich vorher mit "class" definiert. Das Problem: Wenn 0 zurückgegeben wird, kann ich das in BlitzMax nicht überprüfen. Ich habe das mit "If test = Null" versucht, aber anscheinend ist test nicht gleich Null, auch wenn 0 zurückgegeben wurde. Das Programm lässt sich auch nichtmal debuggen ( der Prozess wird bei DebugStop immer beendet ). Ich hab schon versucht, den GC auszuschalten, aber es bringt nichts. Für Hilfe wäre ich sehr, sehr dankbar. ^^ |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
2 Probleme:
1. ein C Code kann KEINE BM Objekte zurück geben, denn BM Objekte haben noch hidden Fields drin, die du net siehst. Was du machen kannst ist die Klasse in C++ zu definieren und sie in BM extern zu definieren (siehe advanced topics in der hilfe wie das aussehen muss dann). (die Fields werden vom GC benötigt) 2. NULL ist in BM als auch in C NULL, das ist != 0!! |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: ein C Code kann KEINE BM Objekte zurück geben, denn BM Objekte haben noch hidden Fields drin, die du net siehst
Das hatte ich bisher gelöst, indem ich in die Klasse einen Offset von 64 Bit ( in Form von 2 Ints ) eingefügt habe, ansonsten sind die Werte halt immer verschoben gewesen. Zitat: das ist != 0!!
Wie meinst du das? NULL ist gleich 0! Zitat: Was du machen kannst ist die Klasse in C++ zu definieren und sie in BM extern zu definieren
Das isses. Danke dir. ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ProGamer.Coder hat Folgendes geschrieben: Zitat:
ein C Code kann KEINE BM Objekte zurück geben, denn BM Objekte haben noch hidden Fields drin, die du net siehst
Das hatte ich bisher gelöst, indem ich in die Klasse einen Offset von 64 Bit ( in Form von 2 Ints ) eingefügt habe, ansonsten sind die Werte halt immer verschoben gewesen. Der Offset stimmt zwar nur existiert das Objekt im GC dennoch nicht, da es der GC nie erzeugt noch initialisiert hat. Sprich würde der GC je drauf zugreifen wär das Objekt getrasht oder würde den GC ins Jenseits befördern (denn die ersten 2 Einträge sind KlassenID und ReferenceCount) ProGamer.Coder hat Folgendes geschrieben: Zitat: das ist != 0!!
Wie meinst du das? NULL ist gleich 0! Nö ist es nicht. NULL nach Int gecastet ist 0, aber jeder einermassen brauchbare Compiler bricht mit Compiler Error ab wenn du Object != 0 machen würdest, da es ein nicht erlaubter cast ist. (Objekte sind Objekte, Numerics sind Numerics, zumindest in C++, BM und einigen anderen nicht 100% objektorientierten Sprachen) Aber gut das es nu klappt ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: jeder einigermassen brauchbare Compiler bricht mit Compiler Error ab wenn du Object != 0 machen würdest
Das stimmt natürlich, aber Object != NULL geht auch nicht. Bei Visual C++ 2005 ist NULL als 0 definiert. Da ich für meine Zwecke aber eh nur Pointer benutze, ist das ja egal. Denen kann man praktischerweise einfach 0 oder NULL zuweisen. ![]() Vielen Dank nochmal. ![]() |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sorry das ich den alten Thread nochmal hochhol.
@Dreamora: Bei C++ ist NULL tatsächlich equivalent zu 0. Oder anders, NULL ist nichtmal im C++ Standard enthalten sondern ein altes Überbleibsel von C (in C war NULL definiert als (( void* )0)). Zeiger können also in C++ problemlos mit 0 initialisiert werden und auf 0 getestet werden. Folgende Codes sind equivalent: Code: [AUSKLAPPEN] int* p = NULL; int* p = 0; if ( p != NULL ) if ( p != 0 ) |
||
http://bl4ckd0g.funpic.de |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es ist übrigens sehr gut möglich, in C-Code BMax-Types zu erzeugen, wenn man sich mit den funktionen in den h-Dateien in brl.blitz auseinander setzt.
Weiss zwar nicht direkt, wie es geht, aber es sollte gehen, wenn man sich seinen memoriy usw. vom GC holt. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group