On Thursday, 21 November 2013 at 19:21:10 UTC, Ali Çehreli wrote:
On 11/21/2013 07:22 AM, Lemonfiend wrote:

> I'm wondering if it's possible to have a struct in D which
uses the same
> pointer and memory as returned by the extern C function.
> This would allow me to manipulate and use the C struct
directly in D code.
>
> I'm not sure how to better explain this, hopefully the
following
> pseudocode clarifies my question
>
> struct Tree
> {
>      enum treeSize = 40;
>
>      ubyte[treeSize] _this;
>
>      this(int apples)
>      {
>          // use the C provided pointer somehow?
>          // neither of the following seem to do the trick
>          //this = *cppNew(apples);
>          //_this = *cast(ubyte*)cppNew(apples)

If you instead maintain a slice of Apples and assuming that 'apples' is the number of apples, then you can use the following syntax

    Apple[] _this;

// ...

    _this = cppNew[0 .. apples];

I have some information about that syntax under the "Producing a slice from a pointer" section here:

  http://ddili.org/ders/d.en/pointers.html

One thing that is not mentioned in there is that you are still responsible for the Apples that are returned by the C library.

Ali

I had previously attempted this, but without success.
So I decided to give it another try your way.

Slicing is tricky!

ubyte[] _this;
vs
ubyte[size] _this;

and

_this = cPointer[0 .. size];
vs
_this[] = cPointer[0 .. size];


After trying all variations, it still didn't work.
Then a colleague noticed I was checking the results with:

&_this
vs
_this.ptr

I had thought those would give the same result, but apparently not?

So in the end it worked:
ubyte[] _this;
_this = cPointer[0 .. size];
_this.ptr == cPointer: true

Thanks! (and apologies for the late reply)

Reply via email to