ソフトウェア設計及び演習2015

GLib::テキストまとめ

基本データ型

教科書p64の表4.1を参考にしよう.データ型の名前からほぼ,類推できるはず.

  • C言語の基本的な型名の前に「g」を付与
    • gint, gchar, gdouble, ...
  • GLib独自の型もあるので注意
    • guint8, gpointer, gboolean, ...

メモリ割り当て

g_new0(struct_type, n_structs)
指定したデータ型 struct_type のメモリ領域を n_structs 分確保し, 0 で初期化した上で先頭アドレスを返す.実体はマクロ.
void g_free (gpointer mem)
確保したメモリ領域を解放する.

文字列操作

gchar* g_strdup(const gchar *str)
文字列strを新しい文字列としてコピー.領域は新たに確保してくれる.
gchar* g_strdup_printf(const gchar *format, ...)
printf形式で新しい文字列を生成する.領域は新たに確保してくれる.
gchar** g_strsplit(const gchar *string, const gchar *delimiter, gint max_token)
文字列 string を,区切り文字 delimiter で最大 max_tokens 個に分割する.戻り値は,文字列の配列へのポインタ.もちろん,領域は新たに確保してくれる.

ファイルアクセス

gboolean g_file_test (const gchar *filename, GFileTest test)
ファイルの状態を調べる関数. 第2引数に与える値(下記)によって, ファイルが存在するか,ディレクトリか,などを調へられる.
G_FILE_TEST_IS_REGULAR ファイルか
G_FILE_TEST_IS_SYMLINK シンボリックリンクか
G_FILE_TEST_IS_DIR ディレクトリか
G_FILE_TEST_IS_EXECUTABLE 実行可能か
G_FILE_TEST_EXISTS 存在するか
GDir* g_dir_open (const gchar *path, guint flags, GError **error)
ディレクトリをオープンする.
G_CONST_RETURN gchar* g_dir_read_name (GDir *dir)
ディレクトリ内のファイル名を調べる. 呼び出されるごとに,順番にファイル名を返す. 最後にNULLが返る.
void g_dir_close (GDir *dir)
ディレクトリをクローズする.
G_CONST_RETURN gchar* g_get_home_dir (void)
ホームディレクトリを取得する.
gchar* g_get_current_dir (void)
現在のディレクトリを取得する.
gchar* g_path_get_basename (const gchar *file_name)
パスを含んだbasenameから,最後のファイル名(またはディレクトリ名)を返す.
gchar* g_path_get_dirname (const gchar *file_name)
パスを含んだbasenameから,最後のファイル名を取り除いたディレクトリ部分を返す.
gchar* g_build_filename (const gchar *first_element, ...)
引数に与えた文字列(可変個)をファイル名用の区切り文字 (例えば/) で結合し,1つの文字列を作成する.引数の最後は NULL で終える必要がある.

Unicode関係

  • 日本語を扱いたい場合,基本的にはソースに記述する日本語をUTF-8で書けばOK
  • 他の文字コードとUTF-8を相互変換する関数群も提供されている.
    • g_locale_to_utf8, g_locale_from_utf8
    • g_filename_to_utf8, g_filename_from_utf8

連結リスト

GLibにおける双方向リストはGListという構造体で定義される.

struct GList {

  gpointer data;
  GList    *next;
  GList    *prev;

};
GList* g_list_append (GList *list, gpointer data)
リストにデータを追加する.
GList* g_list_insert (GList *list, gpointer data, gint position)
指定した位置に data を挿入する.
GList* g_list_delete_link (GList *list, GList *link_)
link リストから指定した位置のノードを削除する.リストのデータ領域をあらかじめ解放しておく必要がある.
void g_list_free (GList *list)
リストを解放する.リスト中のデータは,あらかじめ解放しておく必要がある
void g_list_foreach (GList *list, GFunc func, gpointer user_data)
リストの各々のノードに対して関数 func を実行する.

GFuncの定義は以下.この関数の第1引数にリストの各データが渡され,第2引数に g_list_foreach の第3引数が渡される.

 void (*GFunc) (gpointer data, gpointer user_data);
guint g_list_length (GList *list)
リストの長さを返す.
GList* g_list_first (GList *list)
リストの先頭のノードを返す.
GList* g_list_last (GList *list)
リストの末尾のノードを返す.
g_list_previous(list)
現在のノードの前のノードを返す.実体はマクロ
g_list_next(list)
現在のノードの次のノードを返す.実体はマクロ
GList* g_list_nth (GList *list, guint n)
n番目のノードを返す.
gpointer g_list_nth_data (GList *list, guint n)
n番目のリストのデータを返す.
GList* g_list_sort (GList *list, GCompareFunc compare_func)
各ノードを,compare func に従ってソートする.

関数 GCompareFunc の定義は以下.

 gint (*GCompareFunc) (gconstpointer a, gconstpointer b);

ハッシュ

ハッシュ関数とは?(Wikipediaの解説)

  • ハッシュ関数の応用例の一つに「ハッシュテーブル」があり,その実用例がいわゆる連想配列である.

GLibにおけるハッシュテーブルは,GHashTableという構造体で定義される.

GHashTable* g_hash_table_new (GHashFunc hash_func, GEqualFunc key_equal_func)
ハッシュテーブルを作成する.hash_func がNULL の場合は関数 g_direct_hash を使用する.関数 key_equal_func は,キーの比較関数
void g_hash_table_insert(GHashTable *hash_table, gpointer key, gpointer value)
新しいキーと値を挿入する
guint g_hash_table_size (GHashTable *hash_table)
GHashTable の中にある要素の数を返す.
gpointer g_hash_table_lookup(GHashTable *hash_table, gconstpointer key)
GHashTable の中にあるキーを検索する.
void g_hash_table_destroy (GHashTable *hash_table)
GHashTable を破棄する. キーとその値を直接確保した場合は,まず先にそれらを解放する必要がある.

一定間隔でのイベントループ

GLibには,一定の間隔で定期的に関数を呼び出せるような機能が提供されている.

guint g_timeout_add (guint interval, GSourceFunc function, gpointer data)
interval値は 1/1000 秒単位で指定する.第3引数には,呼び出す関数functionの引数に渡すデータを与える.関数の戻り値は,作成されたイベントループのID.

関数 GSourceFunc のプロトタイプ宣言は以下.

gboolean (*GSourceFunc) (gpointer data);
gboolean g_source_remove (guint tag)
g_timeout_addで設定した関数のループを停止するために用いる.引数には,関数 g_timeout_add の戻り値から取得したイベントループIDを指定する.


最終更新日:2015/03/05 10:01:30