VC++ 6.0 MFC ダイアログボックス でプログラムを作っています。
質問なのですが、
Release で作成した EXE ファイルで 'このプログラムは不正な処理を行ったので
強制終了されます' というエラーメッセージが出ますが
Debug で作成した EXE ファイルではエラーは出ません。
これは何故でしょうか。
また、Debug で作成した EXE ファイルを使うと、スピードが遅くなる等の問題が
有るのでしょうか。
参考に、Release で作成した EXE ファイルでエラーの出る部分のソースは下記の通りです。
大雑把な内容は、現在あるファイル名と同じファイル名のファイルを作成しようとした時に
もう一度、ファイル名の一部分を入力し直す処理をしています。
エラーが出るのは、もう一度、ファイル名の一部分を入力し直した時です。
どなたか、教えて頂きたく、宜しくお願いします。
void CGPS_16Dlg::OnKillfocusTE2()//*********************************** ロット番号
INPUT
//
// (OUT)...m_TE2
{
UpdateData(TRUE);// データーを取り込み
FILE *fp;
SPEC();//*****
CFileFind finder;// 測定データー、ファイル名取得
BOOL work = finder.FindFile(c:\\gps_data\\*.csv);
fp=fopen(c:\\vc++60\\prog\\gps_16\\file_csv.txt,w);// ファイル名書き込
み:FILE_CSV.txt
while (work) {
work = finder.FindNextFile();
fprintf(fp,%s\n,finder.GetFileName() );
}
fclose(fp);
file3=file1+ _ + m_TE2 + .CSV;//現在作ろうとしているファイル
f_flg=0;
fp=fopen(c:\\vc++60\\prog\\gps_16\\file_csv.txt,r);// 同じファイル
名でないかチェック
while(fscanf(fp,%s,file2)!=EOF) {
if(file2==file3) {
f_flg=1; break;
}
}
fclose(fp);
if(f_flg==1) { // 同じファイル名がある時:f_flg=1
MessageBox(同じファイル名があります。別のロット番号を入力して下
さい。);
GetDlgItem(IDC_TE2)->SetFocus();
return;
}
SetDlgItemText(IDC_LB0,[ 0 ] を押すと測定します。 [ 9 ] を押すと終了し
ます。);
SetDlgItemText(IDC_LB01,[ 7 ] を押すと再測定します。( 続けて2回は不可、
NG ?? の時も不可 ));
buf2.Format([%.1f ~ %.1f],fr_l,fr_h);// SPEC の表示
SetDlgItemText(IDC_LB5,buf2);
buf2.Format([%.1f ~ %.1f],rl_l,rl_h);
SetDlgItemText(IDC_LB6,buf2);
//SetTimer(1,100,NULL);// 0.1 SEC 間隔 =========
if(mode==0) {
SetDlgItemText(IDC_LB14,F(MHz));
SetDlgItemText(IDC_LB15,RL(dB));
GetDlgItem(IDC_LB14) -> ShowWindow(TRUE); // LB14 を表示 [デバ
ッグ用]
GetDlgItem(IDC_TE4) -> ShowWindow(TRUE); // TE4 を表示
GetDlgItem(IDC_LB15) -> ShowWindow(TRUE); // LB15 を表示
GetDlgItem(IDC_TE5) -> ShowWindow(TRUE); // TE5 を表示
}
}
> while(fscanf(fp,%s,file2)!=EOF) {
file2が何だか分かりませんけど、
文字列を読み込むのに充分なバッファを用意していますか?
dairygoods さんへ
file2 は CString で定義していますが、まずいでしょうか。
> file2 は CString で定義していますが、まずいでしょうか。
まずいです。
CStringが内部で確保しているメモリに勝手に書き込めば、
CStringシステムが破綻しますし、
書き込んでもはみ出ないだけのバッファを持っているとも限りません。
次のように充分な長さのバッファを用意して読み込む必要があります。
char buffer[読み込む可能性のある最大の文字列サイズ];
while(fscanf(fp,%s,buffer)!=EOF) {
...
}
dairygoods さんの方法で無事解決しました。
ありがとうございました。