Artikel ini dibuat setelah saya membaca majalah info linux edisi Desember 2007
Glib adalah sebuah library bawaan dari GTK yang didalamnya terdapat banyak sekali wrapper function. diantaranya adalah fungsi untuk struktur data.
perintah pkg-config digunakan untuk melakukan generate otomatis parameter waktu kompilasi
syntax :
code pkg-config [option]
option –cflags digunakan untuk menghasilkan parameter include folder untuk gcc
contoh :
pkg-config --cflags glib-2.0
menghasilkan : -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
option –libs akan menghasilkan nama library yang akan di gunakan
contoh :
pkg-config --libs glib-2.0
menghasilkan : -lglib-2.0
cara untuk kompilasi dengan gcc adalah
syntax :
gcc `pkg-config --cflags -libs glib-2.0` [source] -o [executable]
contoh :
gcc `pkg-config --cflags -libs glib-2.0` glib1.c -o glib1
menghasilkan : file executable glib1
catatan tanda ` bukan merupakan tanda petik, karater tersebut biasa terletak pada tombol yang sama dengan simbol ~ (tilde) pada keyboard anda
apabila pkg-config mengeluarkan bahwa library tersebut tidak ditemukan, maka anda terlebih dahulu harus menginstall library Glib-2.0
dengan cara
sudo apt-get install libglib2.0-dev libglib2.0-doc
Ok.. lets start our first program. contoh program sederhana
//Begin file glib1.c
#include <stdio.h>
#include <glib.h>
int main (void)
{
GString *gstr = g_string_new("Hello world! from Glib");
printf("\n%s\n",gstr->str);
g_string_free(gstr, TRUE);
return 0;
}//End file glib1.c
program tersebut akan menghasilkan output
Hello world! from Glib
Seletah mengetahui dasarnya, berikutnya kita mempelajari bagaimana cara menggunakan single linked list
struktur data sigle linked list dalam glib disebut dengan GSList
Sebelumnya, mari kita lihat struktur data dari GSList (Slingle Linked List)
typedef struct {
gpointer data;
GSList *next; //pointer ke node selanjutnya
} GSList;
atau dalam gambar ditunjukan sebagai berikut :
Program sederhana untuk membuat list adalah sebagai berikut :
//begin file glist2.c
#include <stdio.h>
#include <glib.h>
#include <glib> //untuk g_fprintf
int main (void)
{
GSList *slist = NULL; g_fprintf(stdout, "Jumlah node : %d\n", g_slist_length(slist));
g_slist_free(slist);
return 0;
}
//end file glist2.c
Apabila di jalankan program tersebut akan menghasilkan :
Jumlah node : 0
Penjelasan : akan membuat list baru dengan 0 element
GSList * slist = NULL;
guint g_slist_lengt(GSList*) akan menghasilkan nilai integer dari panjang list.
untuk membebaskan seluruh memori yang dipakai list cukup menggunakan fungsi :
void g_slist_free(GSList*)
Sekarang kita akan mencoba mempelajari cara menambahkan node
//begin file glist3.c
#include <stdio.h>
#include <glib.h>
#include <glib> //untuk g_fprintfint main (void)
{
GSList *slist = NULL;
g_fprintf(stdout, "Jumlah node : %d\n", g_slist_length(slist));
//tambahkan node pertama string
g_printf("\nMenambahkan node : pertama\n");
slist = g_slist_append(slist, "pertama");
g_printf("Isi node ke pertama adalah : %s\n", g_slist_nth(slist,0)->data);
g_fprintf(stdout, "Jumlah node : %d\n", g_slist_length(slist));
//tambahkan node kedua integer
g_printf("\nMenambahkan node : kedua\n");
gint dua = 2;
slist = g_slist_append(slist, (gpointer) dua);
g_printf("Isi node ke dua adalah : %d\n", (gint) g_slist_nth_data(slist,1));
g_fprintf(stdout, "Jumlah node : %d\n", g_slist_length(slist));
//tambah node pada posisi awal (insert first) float
g_printf("\nMenambahkan node : awal\n");
gfloat tiga = 0.3;
slist = g_slist_prepend(slist, &tiga);
g_printf("Isi node ke pertama adalah : %f\n", *(gfloat*)(g_slist_nth(slist,0)->data));
g_printf("Isi node ke ketiga adalah : %s\n", g_slist_nth(slist,1)->data);
g_printf("Isi node ke dua adalah : %d\n", (gint) g_slist_nth_data(slist,2));
g_fprintf(stdout, "Jumlah node : %d\n", g_slist_length(slist));
g_slist_free(slist);
return 0;
}
//end file glib3.c
program ini akan menghasilkan
Jumlah node : 0
Menambahkan node : pertama
Isi node ke pertama adalah : pertama
Jumlah node : 1
Menambahkan node : kedua
Isi node ke dua adalah : 2
Jumlah node : 2
Menambahkan node : awal
Isi node ke pertama adalah : 0.300000
Isi node ke ketiga adalah : pertama
Isi node ke dua adalah : 2
Jumlah node : 3
program ke tiga ini memang terlhiat menjelimet. tetapi akan saya coba jelaskan sejelas mungkin.
Hal ini bertujuan untuk mengeksplorasi fungsi -fungsi pada GSlist
berkut penjelasanya
GSlist* g_slist_append(GSlist *list,gpointer data);
fungsi ini berguna untuk menambahkan node di akhir list, fungsi ini akan mengambalikan list baru hasil “list lama” + node berisi “data”
contoh diatas adalah
g_slist_append(slist, (gpointer) dua);
terdapat struktur data baru yaitu gpointer, gpointer didefinisikan sebagai
typedef void* gpointer;
yaitu tipe data generik meaning, bisa diisi apa aja dari int (iteger) string (GString), float (gfloat) atau apapun
untuk mengakses data terdapat dua fungsi
GSList* g_slist_nth(GSList* list, guint n) akan mengembalikan node ke n (index dimulai dari 0). sehingga mengakses datanya haru s menggunakan
g_slist_nth(GSList* list, guint n)->data artinya mengambil variabel data dari struktur GSList. dimana GSList adalah sebuah node.
ingat kembali bahwa struktur data GSList adalah
typedef struct {
gpointer data;
GSList *next;
} GSList;
fungsi yang kedua adalah langsung mengambil datanya
gpointer g_slist_nth_data (GSList *list, guint n); fungsi ini akan mengembalikan data pada node ke n (index dimulai dari 0)
pada contoh diatas kita mengambil node pertama dengan perintah
g_slist_nth(slist,0)->data
dan node kedua dengan perintah
g_slist_nth_data(slist,1)
selain memasukan di akhir list kita juga dapat memasukan data di akhir list dengan fungsi
GSList* g_slist_prepend (GSList *list, gpointer data);
contoh ketiga lebih “tricky” sebenarnya yang kita simpan bukan nilai variabel float, tapi pointer ke variable float.
agar lebih dapat dimengerti, kita liat lagi pertahap
pertama kita buat variabel float dengan sintaks
gfloat tiga = 0.3;
kedua, untuk mendapatkan pointer ke variabel tersebut kita pakai tanda ampersand (&
pada variabel tersebut
sehingga &tiga menghasilkan gfloat* atau pointer ke gfloat.
lalu pointer tersebut kita tambahkan pada list dengan perintah
slist = g_slist_prepend(slist, &tiga);
lalu untuk mengaksesnya kita menggunakan perintah
g_slist_nth(slist,0)->data
tetapi perintah ini masih menghasilkan gpoiter bukan float*, sedangkan kita membutuhkan gfloat* (pointer ke float)
oleh karena itu kita melakukan “type casting” dengan perintah
(gfloat*)(g_slist_nth(slist,0)->data)
sekarang kita telah memiliki variabel dengan gfloat*. untuk mengakses isi pointer tersebut kita tambahkan tanda * (bintang) pada depan variabel
sehingga menjadi
*(gfloat*)(g_slist_nth(slist,0)->data)
sintaks tersebut akan mengasilkan float yang siap di print
kenapa nga lansung nyimpen float make
slist = g_slist_prepend(slist, (gpointer) tiga) ? (perhatikan tanda '&' di casing menjadi gpointer )
karna ketika saya mencobanya terdapat error
glib3.c:27: error: incompatible type for argument 2 of ‘g_slist_prepend’
tidak seperti sebellumnya kita dapat langsung menyimpan integer
g_slist_append(slist, (gpointer) dua);
ternyata type casting tipe data float tidak semudah integer. sampai saat ini saya belum menemukan kenapa ![]()
<!– End Part One
–>
No comments yet.