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.

Reply via email to