Struct in file.c

BlitzMax Forums/BlitzMax Programming/Struct in file.c

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Is it any easier to use a class in a c++ file?

I think with C++ classes you only have access to its virtual methods.

To be able to use memory allocated in C via a BlitzMax Type, you need to do some trickery. And you cant use all BlitzMax types, such as Strings/Objects/Arrays etc.

And this may brake if there are changes to the way BlitzMax handles types.

This is just one way of doing it, there are probably more.

test.bmx:
Import "test.c"

Extern "C"
	Type TStruct
		Field I:Int
		Field F:Float
		Field S:Byte Ptr
	EndType
	
	Function CreateStruct( struct:TStruct Var, i:Int, f:Float, s$z)
	Function CreateStruct2:TStruct( i:Int, f:Float, s$z)
	Function FreeStruct( struct:TStruct Var)
EndExtern

'Local struct:TStruct = CreateStruct2( 10, 1.5, "Hello World!")
Local struct:TStruct
CreateStruct( struct, 10, 1.5, "Hello World!")
Print "ptr: " + Int(Byte Ptr struct)
Print "i: " + struct.i
Print "f: " + struct.f
Print "s: " + String.FromCString(struct.S)
FreeStruct( struct)
Print "ptr: " + Int(Byte Ptr struct)

test.c:
typedef struct {
	int i;
	float f;
	char* s;
} STRUCT;

void CreateStruct( STRUCT** out, int i, float f, char* s) {
	STRUCT* sc = (STRUCT*)malloc( sizeof( STRUCT));
	sc->i = i;
	sc->f = f;
	sc->s = s;
	*out = (char*)sc - 4; // this is the important part!
}

STRUCT* CreateStruct2( int i, float f, char* s) {
	STRUCT* sc = (STRUCT*)malloc( sizeof( STRUCT));
	sc->i = i;
	sc->f = f;
	sc->s = s;
	return (char*)sc - 4; // this is the important part!
}

void FreeStruct( STRUCT** sc) {
	if( (*sc)->s) free( (*sc)->s); // make sure we free the string, if any
	free( *sc);
	*sc = (void*)0;
}