Cプログラミング言語で(C言語の)関数をシリアライズすることが可能かどうかを知りたいと思います。コンテキストは次のとおりです。キーと値のペアのバイナリ検索ツリーがあります。キーは標準のヌル終了文字列であり、値は次のタイプのものである:C言語で関数をシリアライズ
typedef struct generic_value{
void *val;
void (*free_value)(void *);
void (*write_value)(void *,FILE *);
void *(*read_value)(FILE *);
datatype type;
}generic_value;
本質的に、ノード値は、コア・データ・セット(ボイド*ヴァル)へのポインタを含むだけでなく、ポインタをサポートするためにコアデータのファイルへの書き込み/読み出し機能、コアデータの割り当て解除方法を知っている解放機能などが含まれています。現時点では、上記の構造体は、コアデータの種類を記述するために、追加の列挙型(データ型)を含んでいます
typedef enum{
integer_t,decimal_t,string_t,complex_t,vector_t,matrix_t
}datatype;
私は、これらの構造体のメンバーが指す機能をシリアル化する方法を知っていただきたいと思います(例えば、実行可能BSTがファイルに書き込まれると、その後、これらの関数を知らなくてもメモリにインポートすることができます。その実行可能コードが最初に読み込まれ、read_value()関数が順番に呼び出されますコアデータをvoid * valにインポートする。これにより、「データ型」メンバの必要性がなくなります。これはCでも可能ですか?
*「これはCでも可能ですか」* ***いいえ*** – abelenky
これは一部のOSでは可能かもしれませんが、移植性がなく、非常に安全ではありません。悪意のあるコードがあなたのプログラムで動くようにするには、「特別な」保存ファイルを作成し、それを読み込むために犠牲者を取得する必要があります。あなたはこれをしたいと思いますか?(関数の名前をファイルに書き込んだり、あとで名前を読み取ったり、テーブル内でその名前の対応するコンパイルされた関数を見つけるために参照するのではなく) –
私のBSTが受け入れることができるタイプのセットは、APIによって定義されているように有限であるからです。たとえば、ユーザーが「文字配列(char **)を他のすべての型とともにツリーに格納できるようにしたい」と言う場合。ユーザーが自己の読み込み/書き込みやメモリの割り当てを解除するために使用できる独自の読み取り/書き込み/ dealloc関数を提供するのではなく、この余分な機能をAPIで手作業でハードコードする必要があります。しかし、それが可能かもしれないかどうかを知ることはまだ興味があるので、本当にあなたの応答に感謝します! – justincourriel