構造体のポインタについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たか

構造体のポインタについて

#1

投稿記事 by たか » 16年前

最初に環境を提示しておきます。
C言語暦は半年くらいだと思います。

Windows Vista Home Basic
Visual C++ Express Edition 2008

今、Bitmapファイルを扱うコンソールアプリケーションを作っています。
簡単に説明しますと・・・
ファイルから読み込んだ情報を構造体に格納、そしてその情報を元に画像データを文字列に変換。
のようなプログラムです。

今困っているのは"ファイルから読み込んだ情報を構造体に格納"の部分です。
構造体の中に構造体を入れりてみたりしているうちに"."や"->"が多くなって分からなくなってしまいました。
#define FNAME "256bitmap.bmp"

typedef struct BMPFILEHEADER{
  WORD  bfType;
  DWORD bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD bfOffBits;
}BMPFILEHEADER;

typedef struct {
	BMPFILEHEADER bf;
	BMPINFOHEADER bi;
	RGBQUAD rgb[256];
	BYTE *ImageData;
} BitmapFile_t;

//Bitmapデータを読み込んで文字列に変換
//戻り値:-1 = 不正 1 = 正常
int Bitmap2Str(BitmapFile_t *bmp){
	FILE *fp;
	BitmapFile_t *p;

	if( !(fp = fopen(FNAME, "rb")) ){ //fp == NULL ならば
		printf("ファイルのオープンに失敗。\n");
		return -1;
	}

	p = bmp; //ポインタを扱いやすいように

	//BMPFILEHEADER
	fread(&p->bf.bfType, sizeof(p->bf.bfType), 1, fp);
}
かなり省略しました。関数は未完成です。
処理自体には問題ないはずですが、構造体とポインタの扱いはこれでいいのでしょうか?

記述していない改行が入ってしまったようです。仕様でしょうか?

Justy

Re:構造体のポインタについて

#2

投稿記事 by Justy » 16年前


>処理自体には問題ないはずですが、構造体とポインタの扱いはこれでいいのでしょうか?

 BMPINFOHEADERが何なのか判らないことを除けば、未完という現状では
特に大きな問題はないと思います。

 ただ、WindowsSDKの wingdi.hに BMPの構造体がありますので、
それを使えば自前で定義する必要はないかと。


>記述していない改行が入ってしまったようです。仕様でしょうか?

 どこに改行が入りましたか?

 ちなみに IE以外の環境で
で囲んだ中に、1つ多く改行が入っているところ
だとすれば、一応仕様ということになります。

たか

Re:構造体のポインタについて

#3

投稿記事 by たか » 16年前

>BMPINFOHEADERが何なのか・・・
その他の構造体は見づらくなると思ったので省略していました。

>ただ、WindowsSDKの・・・
ライブラリに頼らずに実装しようとしたので、あえて使いませんでした。

>どこに改行が入りましたか?
具体的に説明しますが、

int a;
int b;

↑をpreタグで囲むと↓こうなるわけです。
他の方々の質問を見る限り仕様だったようですが・・・。

int a;

int b;


省略した構造体です。
typedef struct BMPFILEHEADER{
  WORD  bfType;
  DWORD bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD bfOffBits;
}BMPFILEHEADER;

typedef struct BMPINFOHEADER{
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
}BMPINFOHEADER;

typedef struct RGBQUAD{
  BYTE  rgbBlue;
  BYTE  rgbGreen;
  BYTE  rgbRed;
  BYTE  rgbReserved;
}RGBQUAD;
ポインタは扱い方を間違えると何がおきるか分からないので、少し不安でした。
エラーは出なくても重大な問題があるプログラムだったかも!とか思ったりして・・・。

他に問題はないですよね?一応解決にしておきます。
問題があれば指摘してください。

Justy

Re:構造体のポインタについて

#4

投稿記事 by Justy » 16年前


>↑をpreタグで囲むと↓こうなるわけです。
>他の方々の質問を見る限り仕様だったようですが・・・。

 一応回避する方法もありますよ。

[color=#d0d0ff" face="monospace]
if( !(fp = fopen(FNAME, "rb")) ){ //fp == NULL ならば
printf("ファイルのオープンに失敗。\n");
return -1;
}
[/color]

というふうに。



>他に問題はないですよね?

 強いて言うなら Bitmap2Str()に戻り値がないとか、freadで読んでいく際のエラー処理がない、とかが
挙げられますが、未完成とのことなのであまり深くは突っ込んでも仕方がないのかな、と。

 完成してから改めて質問するのがいいかと思います。

toyo

Re:構造体のポインタについて

#5

投稿記事 by toyo » 16年前

ちょっと気になったのですが構造体の定義の際にパディングが入らないようにpackしてますか
#pragma pack(push, 1)
/* 構造体の定義 */
#pragma pack(pop)
packしないとファイルから構造体に読み込むときや読み込んだファイルを構造体のポインタに割り当てるときにずれてしまいます。

たか

Re:構造体のポインタについて

#6

投稿記事 by たか » 16年前

気付かずに返信遅れてしまいした。

構造体の変数1つづつエラーチェックを行っているのでpackはしていません。
最初はその方法で実装していましたが、不正なBMPだった場合は処理が面倒だったので。
fread(&p->bf.bfType, sizeof(p->bf.bfType), 1, fp);
if( !(p->bf.bfType) == *(WORD)"BM") )
	return (-1);

閉鎖

“C言語何でも質問掲示板” へ戻る