Setting Types in C
BlitzMax Forums/BlitzMax Programming/Setting Types in C
| ||
| Hi! How can I set String Fields of BlitzMax Types in an external C function? I've tried the following: ref.bmx SuperStrict Framework BRL.Blitz Import "ref.c" Extern "C" Function getTest(test:Byte Ptr) End Extern Type TTest Field Foo:String Field Bar:String Field Info:String Method Debug() DebugLog(Foo + " " + Bar + " " + Info) End Method End Type Local test:TTest = New TTest For Local i:Int = 0 Until 100 getTest(test) test.Debug() Delay 100 Next End ref.c #include <brl.mod/blitz.mod/blitz.h>
#include <windows.h>
typedef struct {
BBString *Foo;
BBString *Bar;
BBString *Info;
} TTEST;
void getTest(TTEST *test) {
BBRELEASE(test->Foo);
BBRELEASE(test->Bar);
BBRELEASE(test->Info)
test->Foo = bbStringFromCString("Foo");
test->Bar = bbStringFromCString("Bar");
char info[255];
sprintf(info, "%d ms", GetTickCount());
test->Info = bbStringFromCString(info);
}both in the same directory. When I try to run ref.bmx in the debug mode I'am getting: DebugLog:Foo Bar 2200671 ms DebugLog:Foo Bar 2200765 ms DebugLog:Foo Bar 2200875 ms DebugLog:Foo Bar 2200968 ms bad refs:obj=$c30670 refs=$7fffffff String:Foo bad refs:obj=$c30690 refs=$7fffffff String:Bar bad refs:obj=$c306b0 refs=$7fffffff String:2195937 ms bad refs:obj=$c30800 refs=$7fffffff String:Foo bad refs:obj=$c30820 refs=$7fffffff String:Bar ... When I comment out the BBRELEASE-Macro calls, I'am getting false results like: DebugLog:Bar Bar 2554250 ms DebugLog:Foo 2616703 ms 2616703 ms So, how can I set BBStrings-Fields in C correctly? cu olli |
| ||
| You can't do that in C with BlitzMax... The two "types" are not compatible. There are some posts on the forums which explain how to do something like you want with C++. And you really don't want to be calling BBRELEASE() if you don't know what you're doing :-p |
| ||
| Hmm, OK thx! ... It's possible to setting 3 String via calling by reference? Like a function void getTest2(BBString *Foo, BBString *Bar, BBString *Info) {
Foo = bbStringFromCString("Foo");
Bar = bbStringFromCString("Bar");
char info[255];
sprintf(info, "%d ms", GetTickCount());
Info = bbStringFromCString(info);
}Whats the extern block for it in BMax? String Ptr isn't possible. cu olli |
| ||
| Any generic pointer can be defined as Byte Ptr. |
| ||
| No way with Byte Ptr, my Strings are alway empty :( So whats with C++? I've tested this: Ref.cpp #include <brl.mod/blitz.mod/blitz.h>
#include <windows.h>
class TTest {
public:
BBString *a;
BBString *b;
BBString *c;
TTest() {
a = &bbEmptyString;
b = &bbEmptyString;
c = &bbEmptyString;
}
virtual ~TTest() {
a = &bbEmptyString;
b = &bbEmptyString;
c = &bbEmptyString;
}
virtual void getTest() {
a = bbStringFromCString("Foo");
b = bbStringFromCString("Bar");
char info[255];
sprintf(info, "%d ms", GetTickCount());
c = bbStringFromCString(info);
}
};
extern "C" {
TTest *CreateTTest(){
return new TTest;
}
void DestroyTTest(TTest *test) {
delete test;
}
}
Ref.bmx SuperStrict Framework BRL.Blitz Import "ref.cpp" Extern Type TTest Field a : String Field b : String Field c : String Method _pad1() ' padding for virtual destructors Method _pad2() Method getTest() End Type Function CreateTTest:TTest() Function DestroyTTest(test:TTest) End Extern Local test:TTest = CreateTTest() For Local i:Int = 0 Until 1000 test.getTest() DebugLog test.a + " " + test.b + " " + test.c Delay 10 Next DestroyTTest(test) Getting some times output like: DebugLog:FooDebugLog:Foo Bar 4498281 ms ... DebugLog:Foo 4500109 ms 4500109 ms Whats wrong? cu olli |
| ||
| I ended up using getters/setters for stuff like that, and I use cstring($z) to save messing about with BBString. cpp... bmx.. Maybe not ideal, but it works ;) |
| ||
OK, thank you, thats the way I will going :) I've tested it with virtual BBString *getA() {
return bbStringFromCString(a);
}and it works without bad refs or unexpected results too :) cu olli |