2016-05-28 10 views
0

habe ich ein dynamisches Array von simgrid Bibliothek:Dynamische Array von dynamischen Arrays in SimGrid

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

I String hinzugefügt:

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

Es ist in Ordnung und dynar enthält Wert dieser Zeichenfolge.

Ich möchte eine dynamic array von dynamischen Arrays erstellen. Ich benutze:

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

Dann habe ich diese dynar zu dynar_dynar

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

Wie kann ich die Werte ("string") aus dynar_dynar abrufen? Also möchte ich diese dynar von dynar_dynar bekommen. Ich benutze diesen Code, aber es hilft nicht.

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 

Warum temp_dynar enthält nichts?

UPD Ich habe auch versucht, diese zu verwenden:

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

Und wieder temp_dynar enthält nichts.

Antwort

4

Die Quintessenz ist, dass xbt_dynar jetzt veraltet sein sollte. Wir arbeiten daran, den gesamten SimGrid-Quellcode in die C++ - Standardcontainer zu konvertieren. Sobald dies erledigt ist, werden wir den Dynar von unserer Codebasis entfernen.

Sie müssen die Adresse Ihrer Strings in den Dynar schieben, nicht die Strings selbst. Blättern Sie ein bisschen auf der folgenden Seite ein vollständiges Beispiel: http://simgrid.gforge.inria.fr/simgrid/3.14/doc/group__XBT__dynar.html Insbesondere verwenden immer einen Zeiger auf die Daten, die Sie speichern möchten: // xbt_dynar_push(dynar_dynar, dynar); WRONG! don't do that xbt_dynar_push(dynar_dynar, &dynar); // RIGHT. Use a pointer to dynar

Um den spitzen Inhalt abrufen, ist die beste dieser Schnittstelle zu verwenden: http://simgrid.gforge.inria.fr/simgrid/3.14/doc/group__XBT__dynar__speed.html Grep im SimGrid-Quellcode für Beispiele zur Verwendung von xbt_dynar_get_as().

Dies sollte den Trick tun: xbt_dynar_t dyn = xbt_dynar_get_as(dynar_of_dynars, 0, xbt_dynar_t); char *str = xbt_dynar_get_as(dyn, 0, char *);