On Friday, 8 February 2019 at 06:55:15 UTC, Jerry wrote:
On Friday, 8 February 2019 at 04:51:08 UTC, Sudhi wrote:
On Friday, 8 February 2019 at 04:30:23 UTC, Arun Chandrasekaran wrote:
On Friday, 8 February 2019 at 04:13:39 UTC, Sudhi wrote:
[...]

Works fine for me with DMD64 D Compiler v2.083.1. https://run.dlang.io/is/RRM8GU


My example code was wrong. Below is the right one.

struct Company
{
    string name;
    string location;
}

struct Racks
{
    int number;
    int location;
}

struct Metadata
{
    string name;
    Company[] companies;
    Racks[] racks;
}

struct Item
{
    Metadata[] met;
    int count;
}

shared (Item) item;

void main()
{
   updateMetadata();
}

void updateMetadata()
{
   Company company;
   company.name = "Hello";
   company.location = "Bangalore";
   item.met.companies ~= company;
   import std.stdio: writeln;
   writeln(item);
}

https://run.dlang.io/is/iem0PY

You have to cast away shared:

auto loc_item = cast(Item) item;
loc_item.met ~= m;
item = cast(shared) loc_item;

Just to be clear, this is not threadsafe and require a mutex if you do this other than as init in main.

You do not need to cast away shared. You had a couple of issues with your `updateMetadata()` function.

First of, `met` is an array, so you need to index it: your code `item.met.companies ~= company` becomes `item.met[0].companies ~= company`. This will compile, but throw a range error because you don't have any `Metadata` object in your `met` array.

I have typed below the revised form of your function

```
void updateMetadata()
{
   // create a Company instance. This must be shared
   shared Company company;
   company.name = "Hello";
   company.location = "Bangalore";

   // create a shared Metadata instance
   shared Metadata m;
   m.name = "m";

   // append m to the array of meta
   item.met ~= m;
// append the company to the array of companies, for a given meta
   item.met[0].companies ~= company;

   import std.stdio: writeln;
   writeln(item);
}
```

The working version is at https://run.dlang.io/is/RvRKrU

Cheers,
Edi

Reply via email to