Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
September 07, 2019 Interfacing to C++: Cannot access value from namespace | ||||
---|---|---|---|---|
| ||||
I'm running into the following issue when attempting to interface with C++: // C++ ======== namespace MySpace { MyType& GetData(); } struct MyType { // ... float continuallyUpdatedValue; // ... }; // call site MySpace::GetData().continuallyUpdatedValue; // D ======== extern (C++, MySpace) MyType* GetData(); struct MyType { float continuallyChangingValue; // [1] } // call site MySpace.GetData().continuallyUpdatedValue; // <--- This is not being updated by C++ [1] I did not declare any of the other member variables from the struct, don't know if this is a source of the problem. |
September 07, 2019 Re: Interfacing to C++: Cannot access value from namespace | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrew Edwards | On 09/07/2019 03:26 AM, Andrew Edwards wrote: > float continuallyUpdatedValue; > float continuallyChangingValue; // [1] They mean the same thing for an English speaker but compilers don't know that (yet?). :) Ali |
September 07, 2019 Re: Interfacing to C++: Cannot access value from namespace | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Saturday, 7 September 2019 at 12:24:49 UTC, Ali Çehreli wrote:
> On 09/07/2019 03:26 AM, Andrew Edwards wrote:
>
> > float continuallyUpdatedValue;
> > float continuallyChangingValue; // [1]
>
> They mean the same thing for an English speaker but compilers don't know that (yet?). :)
>
> Ali
LOL. Sorry about that, I decided to change the variable name in the middle of writing the post and missed one.
Andrew
|
September 07, 2019 Re: Interfacing to C++: Cannot access value from namespace | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrew Edwards | On Saturday, 7 September 2019 at 12:30:53 UTC, Andrew Edwards wrote:
> On Saturday, 7 September 2019 at 12:24:49 UTC, Ali Çehreli wrote:
>> On 09/07/2019 03:26 AM, Andrew Edwards wrote:
>>
>> > float continuallyUpdatedValue;
>> > float continuallyChangingValue; // [1]
>>
>> They mean the same thing for an English speaker but compilers don't know that (yet?). :)
>>
>> Ali
>
> LOL. Sorry about that, I decided to change the variable name in the middle of writing the post and missed one.
>
> Andrew
The problem existed prior to this naming mishap and remains after correcting it.
|
September 07, 2019 Re: Interfacing to C++: Cannot access value from namespace | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrew Edwards | On 09/07/2019 03:26 AM, Andrew Edwards wrote: > [1] I did not declare any of the other member variables from the struct, > don't know if this is a source of the problem. Yes, it definitely is a problem. The members are accessed as byte offsets into their objects. Without defining the other members, your D-side member is read from offset 0, which is not the case on the C++ side. However, I'm still not sure whether that would solve the problem due to the following differences between C++ and D: - No 'volatile' keyword in D (not in your example code anyway) - Variables are thread-local by default in D But I guess extern(C++) takes care of those differences. (?) So, it should work after defining all the members. :) Ali |
September 07, 2019 Re: Interfacing to C++: Cannot access value from namespace | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Saturday, 7 September 2019 at 12:39:25 UTC, Ali Çehreli wrote:
> On 09/07/2019 03:26 AM, Andrew Edwards wrote:
>
> > [1] I did not declare any of the other member variables from
> the struct,
> > don't know if this is a source of the problem.
>
> Yes, it definitely is a problem. The members are accessed as byte offsets into their objects. Without defining the other members, your D-side member is read from offset 0, which is not the case on the C++ side.
>
> However, I'm still not sure whether that would solve the problem due to the following differences between C++ and D:
That was it, and yes it solves the problem. There are far too many variables to define at the moment so I found the offsetof() and defined a "void[offset] pad" to take care of the issue for right now.
Thanks,
Andrew
|
Copyright © 1999-2021 by the D Language Foundation