在處理C的陣列時,您必須處理陣列長度的問題,您可以使用GLib的GArray,並搭配各個所提供的函式,在使用陣列上會更為方便,GArray的定義如下:
typedef struct {
gchar *data;
guint len;
} GArray;
gchar *data;
guint len;
} GArray;
您有兩種建立GArray的方式:
GArray* g_array_sized_new(gboolean zero_terminated,
gboolean clear_,
guint element_size,
guint reserved_size);
GArray* g_array_new(gboolean zero_terminated,
gboolean clear_,
guint element_size);
g_array_sized_new()的第一個參數
zero_terminated設定為TRUE的話,會加入最後一個額外元素,全部的位元都設定為0,clear_設定為TRUE的話,陣列的全部元素會
設定為0,element_size則是用來設定每個元素的長度,reserved_size則是用以設定陣列的長度,g_array_new()則是巨
集定義的簡化版本,預設長度為0,若加入新的元素,則自動增加陣列長度。gboolean clear_,
guint element_size,
guint reserved_size);
GArray* g_array_new(gboolean zero_terminated,
gboolean clear_,
guint element_size);
要加入新的元素,可以使用g_array_append_val()函式,要依索引取出元素,則可以使用g_array_index()函式,下面這個程式是個簡單的示範:
- garray_demo.c
#include <glib.h>
int main(int argc, char *argv[]) {
GArray *garray;
gint i;
garray = g_array_new(FALSE, FALSE, sizeof(gint));
for (i = 0; i < 5; i++) {
g_array_append_val(garray, i);
}
for (i = 0; i < 5; i++) {
g_printf("%d\n", g_array_index(garray, gint, i));
}
g_array_free (garray, TRUE);
return 0;
}
執行結果如下:
0
1
2
3
4
1
2
3
4
搭配GArray的函式還有g_array_remove_index()、g_array_sort()等,您可以參考 Arrays 的說明。
與GArray類似的是GPtrArray,只不過GArray儲存的是數值(若是structs,則會複製至GArray中),而GPtrArray儲存的是指標,GPtrArray的定義如下:
typedef struct {
gpointer *pdata;
guint len;
} GPtrArray;
gpointer *pdata;
guint len;
} GPtrArray;
舉個例子來說,若要儲存GString的指標,則可以如下所示:
- gptrarray_demo.c
#include <glib.h>
int main(int argc, char *argv[]) {
GPtrArray *array;
gint i;
GString *text;
array = g_ptr_array_new();
for (i = 0; i < 5; i++) {
text = g_string_sized_new(5);
g_string_printf(text, "TEST %d", i);
g_ptr_array_add(array, text);
}
for (i = 0; i < 5; i++) {
text = g_ptr_array_index(array, i);
g_printf("%s\n", text->str);
}
g_ptr_array_free(array, TRUE);
return 0;
}
執行結果如下所示:
TEST 0
TEST 1
TEST 2
TEST 3
TEST 4
TEST 1
TEST 2
TEST 3
TEST 4
GByteArray則允許您儲存guint8的資料,用於儲存位元組資料,為GArray的一個簡化形式,其定義如下:
typedef struct {
guint8 *data;
guint len;
} GByteArray;
guint8 *data;
guint len;
} GByteArray;