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)