50

一連のデータをプログラム可能なドングルに転送する方法を実装しています。ドングルはスマートカード技術に基づいており、内部で任意のコードを実行できます。入力データと出力データは、入力ポインタと出力ポインタを介してアクセスできるバイナリ ブロックとして渡されます。

データ処理コードを簡素化するために、連想配列を使用したいと考えています。すべてがこのように動作するはずです:

最初のホスト アプリケーション:

// Host application in C++
in_data["method"] = "calc_r";
in_data["id"] = 12;
in_data["loc_a"] = 56.19;
in_data["loc_l"] = 44.02;
processor->send(in_data);

次に、ドングル内のコード:

// Some dongle function in C
char* method_name = assoc_get_string(in_data, "method");
int id = assoc_get_int(in_data, "id");
float loc_a = assoc_get_float(in_data, "loc_a");
float loc_l = assoc_get_float(in_data, "loc_l");

だから私の質問は、ドングル部分の機能についてです。上記のような連想配列の動作を実装する C コードまたはライブラリはありますか?

4

7 に答える 7

23

Glib のハッシュ テーブル。マップ インターフェイスまたは (連想配列) を実装します。そして、C で最も使用されているハッシュ テーブルの実装である可能性が最も高いです。

GHashTable *table=g_hash_table_new(g_str_hash, g_str_equal);

/* put */
g_hash_table_insert(table,"SOME_KEY","SOME_VALUE");

/* get */
gchar *value = (gchar *) g_hash_table_lookup(table,"SOME_KEY");
于 2011-02-01T15:36:09.583 に答える
11

Cでハッシュテーブルを実装するヘッダーライブラリであるuthashを試してみてください。小さくてかなり使いやすいです。

于 2011-02-01T15:48:20.473 に答える
11

私の疑いは、あなたが自分で書かなければならないということです。あなたが説明しているアーキテクチャを理解していれば、データのチャンク全体を 1 つの断片として送信する必要があります。その場合、ほとんどのライブラリは、複数のメモリを割り当てる可能性が高く、複数の転送 (および構造の内部理解) が必要になるため、そのためには機能しません。これは、ライブラリ ハッシュ関数を使用しようとして、ルート ポインターを関数に渡すだけで、その内容をネットワーク経由でソケットに送信することに似ていsendます。

単一のメモリ ブロックで非常に単純な連想配列 (またはハッシュ) を管理する独自のユーティリティをいくつか作成することは可能です。データ量が少ない場合は、エントリの単純な線形検索を使用でき、かなりコンパクトなコードになります。

于 2011-02-01T15:39:08.273 に答える
3

はい。ただし、ご指定の方法では動作しません。代わりにstruct、その構造体で動作するデータと関数を格納するために a を使用し、必要な結果を提供します。C の単純な連想配列ライブラリを参照してください。使用例:

struct map_t *test;

test=map_create();
map_set(test,"One","Won");
map_set(test,"Two","Too");
map_set(test,"Four","Fore");
于 2011-02-01T15:37:18.280 に答える
2

GLib のHash TablesBalanced Binary Treesは、あなたが求めているものかもしれません。

于 2011-02-01T15:37:06.023 に答える
2

Mark Wilkins が正しい答えをくれました。データを 1 つのチャンクとして送信する場合は、アーキテクチャで C++ マップがどのように表現されるかを理解し、アクセス関数を記述する必要があります。

とにかく、ドングルでマップを再作成することにした場合は、次のように記述できる小さな C ライブラリを作成しました。

tbl_t in_data=NULL;

tblSetSS(in_data,"method","calc_r");
tblSetSN(in_data,"id",12);
tblSetSF(in_data,"loc_a",56.19);
tblSetSF(in_data,"loc_l",44.02);

その後:

char  *method_name = tblGetP(in_data, "method");
int    id          = tblGetN(in_data, "id");
float  loc_a       = tblGetF(in_data, "loc_a");
float  loc_l       = tblGetF(in_data, "loc_l");

ハッシュテーブルは、Hopscotch ハッシュの変形であり、平均してかなり優れており、キーとデータの型を自由に組み合わせることができます (つまり、テーブル全体をキーとして使用できます)。

その関数の焦点は、純粋な速度ではなくプログラミングを容易にすることであり、コードは完全にテストされていませんが、アイデアが気に入って拡張したい場合は、googlecodeでコードを見ることができます.

(可変長文字列や高速文字列パターン マッチング関数などは他にもありますが、この場合はあまり重要ではありません)。

于 2011-02-01T19:16:36.093 に答える