Search code examples
carrayssimgrid

Dynamic array of dynamic arrays in SimGrid


I created a dynamic array by simgrid library:

xbt_dynar_t dynar = xbt_dynar_new(sizeof(char[20]), NULL);

I added string to it:

char *string = "String";
xbt_dynar_push(dynar, string);

It is okay and dynar contains value of these string.

I want to create a dynamic array of dynamic arrays. I use:

xbt_dynar_t dynar_dynar = xbt_dynar_new(sizeof(xbt_dynar_t), NULL);

Then I added this dynar to dynar_dynar

xbt_dynar_push(dynar_dynar, dynar);
xbt_dynar_push(dynar_dynar, &dynar); // I used this also

How can I retrieve the values ("string") from dynar_dynar? So I want to get this dynar from dynar_dynar. I use this code, but it doesn't help.

    xbt_dynar_t temp_dynar = xbt_dynar_new(sizeof(char[20]), NULL);
    xbt_dynar_get_cpy(dynar_dynar, 0, temp_dynar); //get the dynar from dynar_dynar and put it to temp_dynar

Why temp_dynar contains nothing?

UPD I also tried to use this:

xbt_dynar_t temp_dynar = xbt_dynar_get_as(dynar_dynar, 0, temp_dynar);

And again temp_dynar contains nothing.


Solution

  • The bottom line is that xbt_dynar should be deprecated now. We are working to convert all SimGrid source code to the C++ standard containers. Once this is done, we will remove the dynar from our code base.

    You have to push the address of your strings into the dynar, not the strings themselves. Scroll a bit the following page for a full example: http://simgrid.gforge.inria.fr/simgrid/3.14/doc/group__XBT__dynar.html In particular, always use a pointer to the data you want to store: // xbt_dynar_push(dynar_dynar, dynar); WRONG! don't do that xbt_dynar_push(dynar_dynar, &dynar); // RIGHT. Use a pointer to dynar

    To retrieve the pointed content, the best is to use this interface: http://simgrid.gforge.inria.fr/simgrid/3.14/doc/group__XBT__dynar__speed.html Grep in the SimGrid source code for examples of how to use xbt_dynar_get_as().

    This should do the trick: xbt_dynar_t dyn = xbt_dynar_get_as(dynar_of_dynars, 0, xbt_dynar_t); char *str = xbt_dynar_get_as(dyn, 0, char *);