Đặng Trần Hiếu
(lt2hieu2004)
Thành viên danh dự
1. Giới thiệu chung:
Loạt bài thiết kế giao diện đồ họa cho Linux với Gnome 2 được viết dành cho:
Trước tiên, để có thể thiết kế giao diện đồ họa cho Linux dùng Gnome 2, phải có kiến thức cơ bản về GLib (libglib-2.0). Để sử dụng các tính năng của glib, phải include header glib.h như sau:
Các kiểu cơ bản của GLib gồm có:
Lý do GLib cần có kiểu riêng mà ko sử dụng các kiểu cơ bản của C là vì các kiểu cơ bản của C có thể có độ rộng khác nhau trên các loại máy khác nhau. Ví dụ như kiểu double ở i686 có độ rộng 32 bits nhưng ở máy Alpha lại có độ rộng 64 bits, dùng kiểu cơ bản của GLib giúp mã nguồn có khả năng tương thích tối đa với nhiều hệ máy khác nhau.
3. Quản lý bộ nhớ động với GLib:
Thay vì sử dụng malloc(), realloc() và free() của C, GLib sử dụng các hàm g_malloc(), g_realloc, g_malloc0 và g_free.
Ưu điểm của các hàm quản lý bộ nhớ động của GLib là nó có tính năng kiểm soát lỗi thay vì bị core dump như trong C.
Nhìn chung, cú pháp của các hàm này là giống với các hàm cơ bản của C:
Ngoài các hàm trên, GLib còn có các hàm g_new, g_new0, g_renew. Các hàm này có thể thay thế g_malloc, g_malloc0 và g_realloc, trên thực tế, nên sử dụng các hàm này khi nào có thể vì các hàm này giúp viết mã nhanh, ít lỗi hơn & dễ hiểu hơn. Ví dụ:
Kết thúc phần 1. Phần 2 sẽ được viết tiếp ngày mai (hoặc hôm nay). /
Loạt bài thiết kế giao diện đồ họa cho Linux với Gnome 2 được viết dành cho:
- Những người biết C, hiểu được các tính năng nâng cao như con trỏ, con trỏ đến con trỏ, quản lý bộ nhớ động,...
- Có kiến thức tốt về C macro & các chỉ thị tiền xử lý C (C preprocessors).
- Biết cách sử dụng các chương trình cơ bản của *nix (chỉ cần biết cách khởi động, sử dụng trình soạn thảo,...)
- Kiến thức cơ bản về *nix (processes, libraries,...)
- Không cần có kiến thức về C++
2. Các kiểu cơ bản của GLib- Có kiến thức tốt về C macro & các chỉ thị tiền xử lý C (C preprocessors).
- Biết cách sử dụng các chương trình cơ bản của *nix (chỉ cần biết cách khởi động, sử dụng trình soạn thảo,...)
- Kiến thức cơ bản về *nix (processes, libraries,...)
- Không cần có kiến thức về C++
Trước tiên, để có thể thiết kế giao diện đồ họa cho Linux dùng Gnome 2, phải có kiến thức cơ bản về GLib (libglib-2.0). Để sử dụng các tính năng của glib, phải include header glib.h như sau:
Mã:
#include <glib.h>
- gchar tương đương với char của C
- guchar tương đương với unsigned char của C
- gint tương đương với int của C
- guint tương đương với unsigned int của C
- gshort tương đương với short của C
- gushort tương đương với unsigned short của C
- glong tương đương với long của C
- gulong tương đương với unsigned long của C
- gfloat tương đương với float của C
- gdouble tương đương với double của C
- gint8 tương đương với int 8 bits của C
- guint8 tương đương với unsigned int 8 bits của C
- gint16 tương đương với int 16 bits của C
- guint16 tương đương với unsigned int 16 bits của C
- gint32 tương đương với int 32 bits của C
- guint32 tương đương với unsigned int 32 bits của C
- gint64 tương đương với int 64 bits của C
- guint64 tương đương với unsigned int 64 bits của C
- gpointer tương đương với void * của C
- gconstpointer tương đương với const void * của C
- gboolean là 1 kiểu mới trong GLib (ko có trong C, tương đương với boolean của C++), nhận 2 giá trị TRUE hoặc FALSE.
Lý do GLib cần có kiểu riêng mà ko sử dụng các kiểu cơ bản của C là vì các kiểu cơ bản của C có thể có độ rộng khác nhau trên các loại máy khác nhau. Ví dụ như kiểu double ở i686 có độ rộng 32 bits nhưng ở máy Alpha lại có độ rộng 64 bits, dùng kiểu cơ bản của GLib giúp mã nguồn có khả năng tương thích tối đa với nhiều hệ máy khác nhau.
3. Quản lý bộ nhớ động với GLib:
Thay vì sử dụng malloc(), realloc() và free() của C, GLib sử dụng các hàm g_malloc(), g_realloc, g_malloc0 và g_free.
Ưu điểm của các hàm quản lý bộ nhớ động của GLib là nó có tính năng kiểm soát lỗi thay vì bị core dump như trong C.
Nhìn chung, cú pháp của các hàm này là giống với các hàm cơ bản của C:
- gpointer g_malloc(gulong n) tương đương với void *malloc(size_t size)
- gpointer g_malloc0(gulong n) - giống như g_malloc nhưng cấp phát bộ nhớ giống như calloc tức là đặt giá trị của bộ nhớ vừa cấp phát bằng 0.
- gpointer g_try_malloc(gulong n) - giống như g_malloc nhưng không có tính năng kiểm soát lỗi.
- gpointer g_realloc(gpointer mem, gulong n) tương đương với void *realloc(void *ptr, size_t size)
- gpointer g_try_realloc(gpointer mem, gulong n) - tự hỉu b-)
- void g_free(gpointer mem) tương đương với void free(void *ptr)
Ngoài các hàm trên, GLib còn có các hàm g_new, g_new0, g_renew. Các hàm này có thể thay thế g_malloc, g_malloc0 và g_realloc, trên thực tế, nên sử dụng các hàm này khi nào có thể vì các hàm này giúp viết mã nhanh, ít lỗi hơn & dễ hiểu hơn. Ví dụ:
Mã:
#include <glib.h>
int main(void)
{
gchar *a;
/* Sử dụng g_malloc để cấp phát bộ nhớ cho 1 chuỗi 30 ký tự */
a = (gchar *)g_malloc(sizeof(gchar)*30);
/* Dùng g_new */
a = g_new(gchar, 30);
/* Sử dụng g_malloc0 để cấp phát bộ nhớ cho 1 chuỗi 30 ký tự */
a = (gchar *)g_malloc0(sizeof(gchar)*30);
/* Sử dụng g_new0 */
a = g_new0(gchar, 30);
/* Mở rộng chuỗi 30 ký tự đã cấp phát bộ nhớ thành 40 ký tự */
a = (gchar *)g_realloc(a, sizeof(gchar)*40);
/* Sử dụng g_renew */
a = g_renew(a, 40);
return 0;
}
Chỉnh sửa lần cuối: