C言語 デバック時のブレークポイントの出現理由が分からない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
temdon
記事: 3
登録日時: 1年前

C言語 デバック時のブレークポイントの出現理由が分からない

#1

投稿記事 by temdon » 1年前

Bmpファイルを読み込んで,何も手を加えずに,out.bmpファイルを作成するコードを個人のサイト様を参考にして作ってみたのですが,デバック中にブレークポイントが発生しましたと警告が出て止まります.
継続を選択するとexeファイルが作成され,コマンドプロンプトから実行すると,out.bmpが作成されている結果が得られました.
中断を選択すると18行目

コード:

fread(&biSize, sizeof(int), 1, fp); //情報ヘッダーにあるサイズを読み込む
に矢印が出現し「このスレッドによって現在の関数が実行された後,次に実行されるステートメントです」と表示されています.しかしデバックなしで開始を選択すると,このウインドは出てきません.
これは何が原因なのでしょうか.よろしくお願いします.
同じようなことで以前質問されている方がいましたが解決されなかったようです...(viewtopic.php?t=13824

以下ソースコード全文です.

コード:

#include<stdio.h>
#include<math.h>
int main(void) {
	unsigned char img[512][512][3]; //読み込んだ画素情報を保存する
	unsigned char BitMapFileHeader[14]; //BMPのファイルヘッダーを保存する
	unsigned int biSize; //BMPのサイズを保存する
	int biWidth; //BMPの幅を保存する
	int biHeight; //BMPの高さを保存する
	unsigned char BitMapInfoHeader[28]; //上記3つ以外のBMPの情報ヘッダーを保存する
	int i, j, c; //for文用
	FILE *fp; //ファイルポインタ
	errno_t error;


	fopen_s(&fp,"sample.bmp", "rb");
	
	fread(&BitMapFileHeader, sizeof(char), 14, fp); //ファイルヘッダーを読み込む
	fread(&biSize, sizeof(int), 1, fp); //情報ヘッダーにあるサイズを読み込む
	fread(&biWidth, sizeof(int), 1, fp); //情報ヘッダーにある幅を保存
	fread(&biHeight, sizeof(int), 1, fp); //情報ヘッダーにある高さを保存
	fread(&BitMapInfoHeader, sizeof(char), 28, fp); //残りの情報ヘッダーを保存
	for (i = 0; i < biWidth; i++) { //0から幅まで
		for (j = 0; j < biHeight; j++) { //0から高さまで
			for (c = 0; c < 3; c++) { //RGBのそれぞれ
				fread(&img[i][j][c], sizeof(char), 1, fp); //画素の情報を読み込んで保存する
			}
		}
	}
	fclose(fp); //ファイルを閉じる


	fopen_s(&fp,"out.bmp", "wb"); //パスのファイルへ書き込み
	
	fwrite(&BitMapFileHeader, sizeof(char), 14, fp); //ファイルヘッダーを書き込む

	fwrite(&biSize, sizeof(int), 1, fp); //情報ヘッダーへファイルサイズを書き込む
	fwrite(&biWidth, sizeof(int), 1, fp); //情報ヘッダーへ幅を書き込む
	fwrite(&biHeight, sizeof(int), 1, fp); //情報ヘッダーへ高さを書き込む
	fwrite(&BitMapInfoHeader, sizeof(char), 28, fp); //残りの情報ヘッダーを書き込む
	for (i = 0; i < biWidth; i++) { //0から幅まで
		for (j = 0; j < biHeight; j++) { //0から高さまで
			for (c = 0; c < 3; c++) { //RGBのそれぞれ
				fwrite(&img[i][j][c], sizeof(char), 1, fp); //画素の情報を保存する
			}
		}
	}
	fclose(fp); //ファイルを閉じる
}

アバター
御津凪
管理人
記事: 200
登録日時: 9年前
住所: 道内
連絡を取る:

Re: C言語 デバック時のブレークポイントの出現理由が分からない

#2

投稿記事 by 御津凪 » 1年前

実はプログラムコードの中にプレークポイントであると明示する関数が存在します。
Visual Studio では __debugbreak() という組み込み関数が存在し、自身がプレークポイントを設定せずともデバッグ環境ではこれを呼ばれるときちんとそこで停止されます。

以下本題。

矢印とともに「このスレッドによって現在の関数が実行された後,次に実行されるステートメントです」という文面は、「再開したときに次に実行される場所」ですので、ブレークポイントの発生タイミングはその直前、

コード:

	fread(&BitMapFileHeader, sizeof(char), 14, fp); //ファイルヘッダーを読み込む
を実行中に発生しているという予測が取れます。(複数の関数が1行内に存在する場合はその限りではない)

なぜ発生しているか、ですが、これは実行時エラーに近い意味を持つブレークポイントの発生です。(種類によってはデバッグ出力欄などにメッセージが出ます)

よく見ますと BitMapFileHeader は unsigned char の配列ですので、

コード:

	fread(BitMapFileHeader, sizeof(char), 14, fp); //ファイルヘッダーを読み込む
もしくは

コード:

	fread(&BitMapFileHeader[0], sizeof(char), 14, fp); //ファイルヘッダーを読み込む
とするのが正しいでしょう。理由についてはC言語の配列の仕様をご確認ください。
This article was written by "Mitsunagi".

temdon
記事: 3
登録日時: 1年前

Re: C言語 デバック時のブレークポイントの出現理由が分からない

#3

投稿記事 by temdon » 1年前

返信が遅れて大変申し訳ありません.
配列の件はたしかにと気づかされました.ありがとうございます.しかし,アドバイスいただいた通りに改善してみたのですが,結果は変わりませんでした.何かほかに考えられることはありますでしょうか.よろしくお願い致します.

Bull
記事: 129
登録日時: 5年前

Re: C言語 デバック時のブレークポイントの出現理由が分からない

#4

投稿記事 by Bull » 1年前

エラーの原因かどうかは分かりませんが、このプログラムにはいくつかの問題があります。

1. fpen_s() でエラーチェックしていない。
 "sample.bmp" が存在しない場合、fread() でエラーが発生します。
2. 画素情報として 512×512 固定の配列を用意していますが、それ以上の大きさの bmp ファイルを読込んだ場合、配列の大きさを越えて読込んでしまう。
3. 24bit カラーのみを対象としているが、チェックをしていない。
4. 1ラインのデータが 4 の倍数以外の場合を考慮していない。
5. 画素情報を、縦を先に読込んでいるが、bmp は1ラインごとに保存されている。

かずま

Re: C言語 デバック時のブレークポイントの出現理由が分からない

#5

投稿記事 by かずま » 1年前

unsigned char img[512][512][3]; だとサイズは 768KB。
Windows の VC++ のデフォルトのスタックサイズは 1MB
なので、大丈夫だと思うのですが、念のため、
static unsigned char img[512][512][3]; として、静的に
確保してみたらどうなりますか?

アバター
御津凪
管理人
記事: 200
登録日時: 9年前
住所: 道内
連絡を取る:

Re: C言語 デバック時のブレークポイントの出現理由が分からない

#6

投稿記事 by 御津凪 » 1年前

こちらの環境(Visual Studio 2017)でコンパイル・デバッグ実行してみましたが、ブレーク(一時停止)することはありませんでした。


もしかしたら読み込むbmpファイルが原因でプログラムが破壊、不正動作を起こしている可能性もありますが、小さいサイズの別のbmpファイルでも同様の現象が起きるか試してみましたか?

また、中間生成ファイルやプロジェクトファイルが破損しておかしな動作をしている可能性もありえますので、リビルドしたり、プロジェクトを作り直したりなどで解消されるかも試してみてください。

最後に他の方が指摘している通り、結果が問題なくとも処理に大きな問題がありますので、それを正しく修正すると発生しなくなるかもしれません。
This article was written by "Mitsunagi".

temdon
記事: 3
登録日時: 1年前

Re: C言語 デバック時のブレークポイントの出現理由が分からない

#7

投稿記事 by temdon » 1年前

>>Bullさん
ご指摘ありがとうございます.問題だらけですね...とても参考になります.ありがとうございます.

>>かずまさん
アドバイスありがとうございます.
しかし変わりませんでした...

>>御津凪さん
何度もアドバイスありがとうございます.
他の人のPC(Visual Studio 2013)で同じコードと画像でコードを回してもらいましたがブレークポイントが出現せず,まわりました.
自分のパソコンのVS2015をアンインストールして,VS2017をインストールして回しましたが同じエラーが出ました...また,以下の様な忠告が出ました.

////////////////////////
Debug Assertion Failed

Program: ディレクトリ¥Project1.exe
File: minkernel¥crts¥ucrt¥scr¥appcrt¥stdio¥fread.cpp
Line: 48

Expressin: stream!=nullptr

For information on how your program can cause an assertion
failure, see the Visual C++ documentation asserts.

(Press Retry to debug the application)
////////////////////////
Line48は一番最後の行です.
入力用の画像は上のexeファイルと同じ場所にあります.

何度も申し訳ありませんがよろしくお願いします.

Bull
記事: 129
登録日時: 5年前

Re: C言語 デバック時のブレークポイントの出現理由が分からない

#8

投稿記事 by Bull » 1年前

temdon さんが書きました:
1年前
また,以下の様な忠告が出ました.

////////////////////////
Debug Assertion Failed

Program: ディレクトリ¥Project1.exe
File: minkernel¥crts¥ucrt¥scr¥appcrt¥stdio¥fread.cpp
Line: 48

Expressin: stream!=nullptr

For information on how your program can cause an assertion
failure, see the Visual C++ documentation asserts.

(Press Retry to debug the application)
////////////////////////
Line48は一番最後の行です.
入力用の画像は上のexeファイルと同じ場所にあります.
アサーションが出ているのは、fread() の fp が NULL だからだと思われます。
fopen_s() の返却値をチェックしていますか?

Visual Studio からプログラムを実行した場合、カレントディレクトリはプロジェクトのディレクトリになります。.exe のあるディレクトリではありません。
"sample.bmp" をプロジェクトのディレクトリに移動させて、実行してみてはいかがでしょうか?

返信

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