Can't return signed longs from .c

BlitzMax Forums/BlitzMax Programming/Can't return signed longs from .c

Tom(Posted 2005) [#1]
Hi,

I was messing with hires timers which use longs. I can't return a signed long from some .c code, am I doing something wrong?

This won't even return 1, let alone 9223372036854775807.

If I change ReturnLong:Long() to ReturnLong:Int() I get '4147483647'

Cheers
Tom



.C
//longtest.c
signed int ReturnInt()
{
	return 2147483647;
}

signed long ReturnLong()
{
	return 1; //9223372036854775807;
}


B'Max

Import "longtest.c"
Extern 
	Function ReturnInt:Int()
	Function ReturnLong:Long()
End Extern

i:Int = ReturnInt()
t:Long = ReturnLong()

Print i '2147483647
Print t 'always 0 ?



Azathoth(Posted 2005) [#2]
long in c isn't the same as in blitzmax, use 'long long'.


Tom(Posted 2005) [#3]
Not sure if you meant long long in C or B'Max, either way doesn't work though.

Edit:

If I change it to this

signed long ReturnLong()
{
return (signed long)9223372036854775807;
}

I get 1 error:
C:/blitzmax/samples/longtest.c:8: warning: integer constant is too large for "long" type

return (signed long)9223372036854775807; is line 8


Azathoth(Posted 2005) [#4]
In c i meant.

signed long long ReturnLong()
{
return 9223372036854775807;
}


Tom(Posted 2005) [#5]
Yeh I tried that too, doesn't work.


marksibly(Posted 2005) [#6]
Longs are returned 'struct style' in Max, eg:

C Code:
#include <brl.mod/blitz.mod/blitz.h>

void bbLongTest( BBInt64 *r,BBInt64 x,BBInt64 y ){
	*r=x+y;
}

Max Code:
Import "ccode.c"
Extern 
Function bbLongTest:Long( x:Long,y:Long )
End Extern
Print bbLongTest( 10,20 )