2016-05-19 21 views
0

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でも可能ですか?

+1

*「これはCでも可能ですか」* ***いいえ*** – abelenky

+0

これは一部のOSでは可能かもしれませんが、移植性がなく、非常に安全ではありません。悪意のあるコードがあなたのプログラムで動くようにするには、「特別な」保存ファイルを作成し、それを読み込むために犠牲者を取得する必要があります。あなたはこれをしたいと思いますか?(関数の名前をファイルに書き込んだり、あとで名前を読み取ったり、テーブル内でその名前の対応するコンパイルされた関数を見つけるために参照するのではなく) –

+0

私のBSTが受け入れることができるタイプのセットは、APIによって定義されているように有限であるからです。たとえば、ユーザーが「文字配列(char **)を他のすべての型とともにツリーに格納できるようにしたい」と言う場合。ユーザーが自己の読み込み/書き込みやメモリの割り当てを解除するために使用できる独自の読み取り/書き込み/ dealloc関数を提供するのではなく、この余分な機能をAPIで手作業でハードコードする必要があります。しかし、それが可能かもしれないかどうかを知ることはまだ興味があるので、本当にあなたの応答に感謝します! – justincourriel

答えて

1

標準Cはコードをデータまたはデータとして扱うメカニズムをコードとして提供しません。さらに、最新のメモリ管理ユニットおよびオペレーティングシステムのほとんどは、実行可能コード用に指定されたメモリとメモリとを区別し、前者へのジャンプを許可しない。たとえそうでなくても、連載しようとしている関数が完全に自己完結型で、標準のライブラリ関数を含む他の関数に依存しない限り、リンケージの問題があります。だから、関数をシリアル化することはできません。

最初にアプリケーションにリンクされていなかった関数を呼び出せるようにするには、実行時に共有ライブラリにリンクする必要があります。 POSIXの世界では、主にライブラリにリンクするためのdlopen()と、必要な機能へのポインタを得るためにdlsym()を探しています。後者は、このアプローチで機能する可能性のあるシリアライゼーション戦略を直接指し示す1つの引数として関数名を取ります。

0

はい、これは可能ですが、「ジェネリックプログラミング」を取り除きます。あなたは実行形式に潜んでいなければなりません。コードを取り出してファイルに書き込むだけではうまくいかないでしょう。あなたはいくつかの計算をし、コードをロードするときにわずかな初期化のために使用されるいくつかの追加情報をそこに格納する必要があります。 Soooはい、これはCで行うことができます。しかし、それはGoogle ELFとPEです。