2

C ++での学習演習として、簡単なTGA画像ファイルセーバーを作成しようとしています。コードは、ヘッダーの構造体を宣言し、fread()を使用してヘッダー全体を一度にロードするTGAローダーの例に基づいています。

私のプログラムは現在機能していません。ファイルに2バイト余分に書き込まれているようです。構造体のサイズを出力しましたが、2バイトが大きすぎます(正しい18ではなく20)。少し読んだ後、問題はデータのアライメントとパディングに関連していると思います(構造体がどのように格納されるかについてはよくわかりません)。

私の質問は、これに対する良い解決策は何ですか?fwrite()を使用して構造体全体を一度に書き込む代わりに、構造体のコンポーネントをバイトごとに書き込むことができると思います。これが、これから行うことです。ヘッダーをロードするときに機能するのであれば、それを書き込むときにも機能すると思いました。私の仮定は間違っていましたか?

4

3 に答える 3

4

コンパイラは、フィールドが適切なメモリ アドレスに配置されるように、パディング バイトを構造体に挿入することが許可されており、頻繁に行っています。

最も簡単な解決策は、コンパイラに構造体を「パック」するように指示することです。これは、パディング バイトを挿入しないことを意味します。ただし、これにより構造体へのデータ アクセスが遅くなり、その方法はコンパイラに依存します。移植可能で効率的になりたい場合は、フィールドを個別に書き込むしかありません。

于 2010-07-19T21:02:27.210 に答える
1

ロードしても動きませんでした。いくつかのオプションがあります。

  1. コンパイラ固有のディレクティブ (#pragmapacked など) を使用して、構造体を強制的に 18 バイトにします。

  2. オフセットとポインターを使用してバッファー フィールドを取得/設定することにより、より移植性の高いコードを記述します。

于 2010-07-19T21:02:45.473 に答える
0

構造体の要素は、一般に 4 バイト境界に配置されます。

構造体に short または char がある場合、構造体は個々の要素のサイズの合計よりも大きくなります。

于 2010-07-19T21:03:01.513 に答える