2

int、time_t、およびいくつかの char* を含む構造体のインスタンスの GHashTable を構築しようとしています。

私の質問は、どのように構造体のインスタンスを GHashTable に挿入するのですか? 文字列または int を挿入する方法の例はたくさんありますが (g_str_hash と g_int_hash をそれぞれ使用)、g_direct_hash を使用したいと思っています。

理想的には、私のコードは次のようになります。

GHashtable table;
table = g_hash_table_new(g_direct_hash, g_direct_equal);
struct mystruct;
mystruct.a = 1;
mystruct.b = "hello";
mystruct.c = 5;
mystruct.d = "test";

g_hash_table_insert(table,mystruct.a,mystruct);

コンパイルされないため、明らかにこれは正しくありません。誰でも私が望むことをする例を提供できますか? ありがとう、リク

4

3 に答える 3

2

自動変数を挿入することはできません。データを動的に保存するためのメモリを割り当てる必要があります。つまり、g_malloc()または同等のものを使用します。

次に、テーブルを効率的にするために、データからハッシュ値を計算する方法を見つける必要があります。ここでの使用g_direct_hash()はあまり良くありません。データへのポインターをハッシュ値として使用します。

a構造のメンバーをキーとして使用したいようです。このフィールドは何型ですか?整数の場合は、 を使用できますg_int_hash()

これは、実際のコードがどのように見えるべきかの行に沿っていると思います:

GHashtable *table;
struct mystruct *my;

table = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, g_free);
my = g_malloc(sizeof *my);
my->a = 1;
my->b = "hello";
my->c = 5;
my->d = "test";

g_hash_table_insert(table, GINT_TO_POINTER(my->a), my);

bこれは、文字列に動的に割り当てられるストレージがないため、メンバーとdメンバーが単なる文字ポインターであると想定していることに注意してください。

于 2010-04-19T12:09:34.540 に答える
1

ハッシュ テーブルにポインターを格納できるように、ヒープに構造体を割り当てる必要があります。

struct SomeType * p = malloc(sizeof(struct SomeType));
p->a = 1;
//etc..
g_hash_table_insert(table,p->a,p);

また、g_hash_table_new_full() を使用して、テーブルが破棄されたときにポインターを適切に解放できるようにする必要があります。

于 2010-04-19T12:07:44.577 に答える
1

ありがとう。上記の例が役に立ちました。これらを読んでネット上のコードサンプルを調べた後、私はそれを機能させることができました. 以下は、私が書いたサンプルの作業コードです。


#include <stdio.h>
#include <glib.h>
#include <stdlib.h>

struct struct_process {
    int pid;
    char* file_to_process;
};

typedef struct struct_process Process;

int main() {
    GHashTable* hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free);

    Process* p1 = (Process*)(malloc(sizeof(Process)));
    p1->pid = 1234;
    p1->file_to_process= "/var/tmp/p1";

    g_hash_table_insert(hash_table, GINT_TO_POINTER(p1->pid), GINT_TO_POINTER(p1));

    # replace 1234 by some other key to see that it returns NULL on nonexistent keys
    Process* p3 = (Process*)(g_hash_table_lookup(hash_table, GINT_TO_POINTER(1234))); 

    if (p3 == NULL) {
       printf("could not find\n");
    } else {
       printf("found and i have to process %s\n", p3->file_to_process);
    }
    g_hash_table_destroy(hash_table);
}
`
于 2010-10-31T07:28:05.070 に答える