www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Interfacing to C++: Cannot access value from namespace

reply Andrew Edwards <edwards.ac gmail.com> writes:
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.
Sep 07 2019
next sibling parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
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
Sep 07 2019
parent reply Andrew Edwards <edwards.ac gmail.com> writes:
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
Sep 07 2019
parent Andrew Edwards <edwards.ac gmail.com> writes:
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.
Sep 07 2019
prev sibling parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
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
Sep 07 2019
parent Andrew Edwards <edwards.ac gmail.com> writes:
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
Sep 07 2019