BlitzMax Types und C++ Klassen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

ChristianK

Betreff: BlitzMax Types und C++ Klassen

BeitragDo, Jun 28, 2007 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jun 28, 2007 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jun 28, 2007 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Very Happy
 

Dreamora

BeitragDo, Jun 28, 2007 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragDo, Jun 28, 2007 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile

Vielen Dank nochmal. Very Happy
 

David

BeitragDo, Jul 19, 2007 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 19, 2007 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group