1

C ビットフィールドを使用してデータをメモリに格納します。アーカイブを使用するには、これらのデータをファイルに書き込む必要があります (後で別のマシンからのデータと組み合わせる必要があります)。データの配置は実装固有であるため、ビットフィールドをファイルに直接保存することはお勧めできません。

このため、これらのビットフィールドを「シリアル化」して統一された形式で保存する方法をいくつか書きました。

/* uint16 is a unsigned int with size 16 */

typedef struct {
    uint16 a : 1;
    /* ... just examples ... */
    uint16 z : 13;
} data;

void save_data(FILE* fp, data d) {
    uint16 tmp;
    tmp = d.a;
    fwrite(&tmp,sizeof(uint16),1,fp);
    /* ... */
    tmp = d.z;
    fwrite(&tmp,sizeof(uint16),1,fp);
}

これは完全に機能していますが、メンバーをdata追加するには保存ルーチンにもデータを追加する必要があるため、拡張するのは適切ではないようです。

ビットフィールド データを変更するときに、ルーチン/マクロを調整する必要なく、ビットフィールド データを統一された形式に自動的に変換する方法はありますか?

4

3 に答える 3

1

少し投資しても構わないと思っている場合は、P99のようなツールを使用して「ステートメントの展開」を行うことができます。

// in header
#define MY_BITFIELDS a, z
#define WRITE_IT(X) fwrite(&(unsigned){ d.X }, sizeof(unsigned), 1, fp)    
#define WRITE_ALL(...) P99_SEP(WRITE_IT, __VA_ARGS__)


// in your function
WRITE_ALL(MY_BITFIELDS);

ところで、これintを回避できる場合は、ビットフィールドには決して使用しないでください。ビットのセットのセマンティックは、よりよく一致しunsignedます。

もう少しマクロコーディングを使用すると、次のようなものを使用することもできます

#define MY_BITFIELDS (a, 1), (z, 11)

struct宣言書き込み部分を生成します。

于 2013-07-24T11:47:55.027 に答える
-1

人間が読めるテキスト形式を使用しないのはなぜですか?

typedef struct {
    int a : 1;
    /* ... just examples ... */
    int z : 13;
} data;

void save_data(FILE* fp, data d) {
    fprintf( fp, "a:%d\n", d.a );
    fprintf( fp, "b:%d\n", d.b );
    ...
    fprintf( fp, "z:%d\n", d.z );
}

この手法の利点は、異なる言語を使用している人が、任意のマシン、任意のアーキテクチャにデータをロードするためのパーサーをすばやく作成できることです。

于 2013-07-24T11:47:44.373 に答える