Is it possible to modify shared struct array in a function.

Eduard Staniloiu edi33416 at gmail.com
Fri Feb 8 11:27:44 UTC 2019


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


More information about the Digitalmars-d-learn mailing list