1

update(char* name, void* data);メッセージの名前を受け取り、そのメッセージのデータにvoid*を受け取る関数を作成する必要があります。データの種類は、名前に応じて常に「xxx_name」に固定されます。

私の関数は次のことを行う必要があります:-

  1. 関数内にxxx_nameタイプの新しい構造を生成します。
  2. データはすぐに外部インターフェースによって解放されるため、サイズxxx_nameのポインターデータから新しい場所にデータをコピーします。

私の場合、タイプxxx_nameの可能な構造のリストはかなり巨大であり、全体に広がっているため、if/elseまたはswitch条件を記述することは問題外です。

マクロ/文字列演算子などを介してCでこれを行う方法はありますか?

4

1 に答える 1

0

このソリューションでは、NULLで終了するルックアップテーブル(LUT)を使用して、適切なサイズを見つけます。次に、そのサイズでメモリを割り当てます。次に、入力データを新しいオブジェクトにコピーします。オブジェクトのタイプの数が十分に多い場合は、LUTを事前に並べ替えることができ、線形検索の代わりにバイナリ検索が実行されます。

#include<stdlib.h>
#include<string.h>

struct nameToSize_s {
    const char *name;
    size_t size;
};

struct foo1_name_s {
};

struct foo2_name_s {
};

const struct nameToSize_s nameToSizeLUT[] = {
    { "foo1_name",  sizeof(struct foo1_name_s) },
    { "foo2_name",  sizeof(struct foo2_name_s) },
    // NULL terminator
    { NULL, 0}
};

void * update(char* name, void *data) {
    const struct nameToSize_s *entry = nameToSizeLUT;

    while(entry->name) {
        if( strcmp(entry->name, name) == 0) break;
        entry++;
    }

    if( entry->name == NULL) abort();

    void *newObj = malloc(entry->size);
    if( newObj == NULL) abort();

    return memcpy( newObj, data, entry->size);
}
于 2012-09-21T00:55:48.940 に答える