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.
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 *);