2015-11-20 7 views
6

Ich habe ein GArray von GValue (alle nicht Null), die zur Laufzeit mit g_array_append_val zugewiesen wurde. Ich frage mich, wie ich herausfinden kann, was der Index des letzten Elements ist, oder genauer, wie viele Elemente das Array enthält. Code wieWie kann ich die Länge eines gegebenen GArrays finden?


for (length=0;g_value_get_int(&g_array_index(array, GValue, length)); length++); 
return length 

würde mit einem Out-of-Grenzen fehlschlagen.

+1

Es liegt an Ihnen, die Anzahl der Elemente zu überwachen, die Sie dem Garray hinzugefügt haben. Wenn er angelegt wird, ordnet ein Garray einen Speicherblock zu, der ausreicht, um eine signifikante Anzahl von Elementen ohne Neuzuweisung aufzunehmen, und hat einen refcount von "1". (Dies geschieht speziell, um eine häufige Neuzuweisung zu verhindern.) Ich weiß nicht, wie ich genau sagen kann, wie viele Elemente vor der Neuzuordnung hinzugefügt werden können, ohne die glib-Quelle zu betrachten. Siehe [** glib - Arrays **] (https://developer.gnome.org/glib/stable/glib-Arrays.html) –

+1

@ DavidC.Rankin Scheint unwahrscheinlich. Wie würde 'g_array_append_val' funktionieren, wenn GArrays ihre Größe nicht verfolgen? – immibis

+0

Punkt gut gemacht, deshalb habe ich das OP an die Quelle verwiesen, weil es nicht in der glib - Array Dokumentation dokumentiert wurde. –

Antwort

12

Es scheint nicht gut dokumentiert zu sein, aber die Anzahl der Elemente im Array wird im Feld array->len gespeichert.

+0

Danke! Oh Mann, ich hätte mir wenigstens die Quelldatei ansehen sollen! ist genau dort in der ersten struct _GArray, der doxygen in der Quelldatei sagt /** * GArray: * Daten: ein Zeiger auf die Elementdaten. Die Daten können verschoben werden, wenn * Elemente zum #GArray hinzugefügt werden. * len: Die Anzahl der Elemente im #GArray ohne das * mögliche Ende-Null-Element. * * Enthält die öffentlichen Felder eines GArray. */ –

+2

Für zukünftige Referenz ist es dokumentiert [hier] (https://developer.gnome.org/glib/stable/glib-Arrays.html#GArray). – ptomato

Verwandte Themen