On Friday, 13 March 2015 at 06:56:33 UTC, Ali Çehreli wrote:
On 03/12/2015 11:35 PM, zhmt wrote:
> ubyte[] arr ;
>
> I pass the arr.ptr to c program
Unless there is sentinel value at the end of the array, you
must also pass the number of elements (as Rikki Cattermole has
shown).
However, if the C function holds on to that pointer for later
use, you must also keep the array alive. You can ensure that by
two general ways:
a) The D-side slice must not be a local slice. For example, it
can be a member of a long-living object or it is a module-scope
variable.
b) Tell the garbage collector that there is indeed a reference
to that memory block somewhere else (even though there is no
D-side reference to it). You can do this with GC.addRoot. (The
opposite function is GC.removeRoot.)
>, it fails silently.
That's not good.
> Is there any way to cast a ubyte[] to a clang pointer?
Going off-topic, I think you mean the C language when you say
"clang", which may be confusing because there is also the
compiler called clang. :)
Ali
sorry for "clang", I mean c , not clang of mac.
Thanks for you advice, I use coroutine, so the array will hold in
stack, will not be gc before return.
And I successfully passed the arr.ptr to c program. I found the
root of problem:
The order of method declaration in c++ class and d interface must
be exactly the same:
this is d code:
interface CConn
{
void free();
int connect(ubyte* ip,int port,CFiberCtx fiberctx);
int read(ubyte* buf,int offset, int len,CFiberCtx fiberctx);
int readSome(ubyte* buf,int offset, int len,CFiberCtx fiberctx);
int write(ubyte* buf,int offset, int len,CFiberCtx fiberctx);
}
this is c++ class:
class CConn
{
public:
//==== dlang interfaces;
virtual void free();
virtual int connect(char* ip,int port,CFiberCtx *fiberctx);
virtual int read(char* buf,int offset, int len,CFiberCtx
*fiberctx);
virtual int write(char* buf,int offset, int len,CFiberCtx
*fiberctx); //ERROR : swap this line with below, everything will
be ok
virtual int readSome(char* buf,int offset, int len,CFiberCtx
*fiberctx);
}
After swapping the last two lines, everything goes well.
The tutorial of d dont mention this.
Thanks for all replies.