ページ 1 / 1
プログラム
Posted: 2009年3月10日(火) 10:25
by ざこ
void CKodomo1Dlg::OnOK()
{
CString str_ed1;
CString str_ed2;
FILE *fp;
m_ed1.GetWindowText(str_ed1);
m_ed2.GetWindowText(str_ed2);
*m_pstr=str_ed1;
*m_qstr=str_ed2;
*chk1=m_chk.GetCheck();//ココ
if(strlen(str_ed1)==0||strlen(str_ed2)==0){
MessageBox("空白があります");
return;
}
if(Flag==FALSE){
if((fp=fopen(str_ed2,"r"))==NULL){
MessageBox("そのファイルはコンピューター内に存在しません");
m_ed2.SetWindowText("");
return;
}
}
CDialog::OnOK();
}
※ダイアログBのクラスCKodomo1クラスでCKodomoのヘッダは
public:
CKodomo1Dlg(CWnd * pParent=NULL)
CString *m_pstr;
CString *m_qstr;
int *chk1;
int* m_FILEOK;
です。
void CDragDrop6Dlg::OnDropFiles(HDROP hDropInfo)
{
long files;
int FILEOK;
char filename[256];
CchkDialog cdlg;
cdlg.m_FILEOK=&FILEOK;
// int n;
CString str_index;
files=DragQueryFile(hDropInfo, 0xFFFFFFFF,filename,256);
DragQueryFile(hDropInfo, 0, filename,256);
CString Cname=getFileName(filename);
CString kaku;
int index=-1;
CKodomo1Dlg dlg;
i=m_listC.GetItemCount();
kaku=strchr(filename,'.');
dlg.chk1=&chk;
//for( int index=0;index<i;index++){
while((index=m_listC.GetNextItem(index,LVNI_ALL))!=-1){
str_index=m_listC.GetItemText(index,0);
CString str_index2=m_listC.GetItemText(index,1);
CString Rname=str_index2+"\\"+Cname;
if(kaku=="."+str_index){
// n=index;
cdlg.DoModal();
if(FILEOK==1){
if(chk==1){
MessageBox("上書きされます");
MoveFileEx(filename,str_index2,MOVEFILE_REPLACE_EXISTING);
MoveFileEx(filename,str_index2+"\\",MOVEFILE_REPLACE_EXISTING);
MoveFileEx(filename,Rname,MOVEFILE_REPLACE_EXISTING);
}
else{
MoveFile(filename,str_index2);
MoveFile(filename,str_index2+"\\");
MoveFile(filename,Rname);
}
}
}
else if(kaku!="."+str_index){
}
}
}
以前よりご質問させていただいてたプログラムの一部なんですがコメントの位置、つまり
*chk1=m_chk.GetCheck(); で止まってしまいます。
これはダイアログAの「追加ボタン」を押すとダイアログBが出現し今ダイアログBにいます。
ダイアログBの関数OnOKでチェックボックスのチェックの有無をAに伝えようとしています
。何故エラーになるのでしょうか。エラー内容は
"問題が発生しました。 プログラムを終了します" です。おしえてください
Re:プログラム
Posted: 2009年3月10日(火) 11:15
by Blue
>dlg.chk1=&chk;
chkってどこに宣言されているの?
CKodomo1Dlgのコンストラクタでchk1をNULLで初期化して、
CKodomo1Dlg::OnOK() でchk1がNULLでないことを確かめてみては?
ASSERT(chk1 != NULL);
Re:プログラム
Posted: 2009年3月10日(火) 11:16
by バグ
まずは問題のある箇所にブレイクポイントを設定して、chk1に元の変数のアドレスがきちんと格納されているかを確認してみてください。
Re:プログラム
Posted: 2009年3月10日(火) 11:17
by バグ
あ、Blueさんと被ってしまいました。すみません(^_^;)
Re:プログラム
Posted: 2009年3月10日(火) 11:54
by ざこ
あ・・chk1はダイアログAのヘッダに入ってます。
chk1をNULLで初期化してOnOKの
m_ed1.GetWindowText(str_ed1);
m_ed2.GetWindowText(str_ed2);
ASSERT(chk1!=NULL);
*m_pstr=str_ed1;
*m_qstr=str_ed2;
*chk1=m_chk.GetCheck();
でやるとASSERTを通ろうとすると Debug Assertion Failed!となります。
これは格納されていないのでしょうか?
Re:プログラム
Posted: 2009年3月10日(火) 11:58
by ざこ
問題のある箇所
*chk1=m_chk.GetCheck()の部分にブレークポイント置いて
chk1の中身をみると0x0000000で、これより下にいこうとすると
ハンドルされていない例外 は ●●.exeにあります とでます
Re:プログラム
Posted: 2009年3月10日(火) 12:00
by Blue
Debug Assertion Failed! のダイアログで「再試行」を選ぶとASSERTの記述のある行に
飛ぶことができます。
そこでローカルウィンドウでもウォッチでもいいのでchk1の値を確認してみてはどうでしょうか?
>>>dlg.chk1=&chk;
>>chkってどこに宣言されているの?
>あ・・chk1はダイアログAのヘッダに入ってます。
回答になっていません。chk1ではなくchkです。
それと、タイトルはもう少しましなものをつけましょう。
だいたいすべての質問がプログラムに関してですから。
Re:プログラム
Posted: 2009年3月10日(火) 12:01
by バグ
>>chk1の中身をみると0x0000000で、これより下にいこうとすると
chk1にきちんとアドレスが格納されていないようですね。これが原因です。
Re:プログラム
Posted: 2009年3月10日(火) 12:16
by ざこ
その方法でもchk1の中身は0x000000でした。
X chk1
○ chkでした。
記述ミスです
タイトルのことですが今回は特に特定の関数を使うものじゃないですから
つけるとしてもMFCプログラム とかでしょうか。
Re:プログラム
Posted: 2009年3月10日(火) 12:27
by Blue
>CKodomo1Dlg dlg;
>dlg.chk1=&chk;
っていつ表示しているの?
表示している箇所が見当たらないけど。
CDragDrop6Dlg::OnDropFiles内の
dlgのchk1に値を入れているわけなのでそれ以外で表示しようとしてもNULLになるに決まっています。
>つけるとしてもMFCプログラム とかでしょうか。
違いますね。
>*chk1=m_chk.GetCheck(); で止まってしまいます。
>"問題が発生しました。 プログラムを終了します" です。おしえてください
という趣旨が伝わるようなタイトルにします。
たとえば、
ポインタに値を代入しようとすると「問題が発生しました。」になってしまう
とか。
Re:プログラム
Posted: 2009年3月10日(火) 13:02
by ざこ
void CDragDrop6Dlg::OnDropFiles(HDROP hDropInfo)
{
long files;
int FILEOK;
char filename[256];
CchkDialog cdlg;
cdlg.m_FILEOK=&FILEOK;
int n;
CString str_index;
files=DragQueryFile(hDropInfo, 0xFFFFFFFF,filename,256);
DragQueryFile(hDropInfo, 0, filename,256);
CString Cname=getFileName(filename);
CString kaku;
int index=-1;
CKodomo1Dlg dlg;←
i=m_listC.GetItemCount();
kaku=strchr(filename,'.');
dlg.chk1=&chk; ← これでしょうか?
まぁタイトルに関してはそれほどきにしていませんでした。今回の場合原因もわからなかったので
つけるとすれば
"問題が発生しました・・"の方ですね
Re:プログラム
Posted: 2009年3月10日(火) 14:02
by ざこ
原因の方はわかりましたが何故アドレスが渡っていないかですね・・
Re:プログラム
Posted: 2009年3月10日(火) 14:20
by Blue
再度
>CDragDrop6Dlg::OnDropFiles内の
>dlgのchk1に値を入れているわけなのでそれ以外で表示しようとしてもNULLになるに決まっています。
つまり、chk1を代入しているものと
CKodomo1Dlg::OnOK
で
*chk1=m_chk.GetCheck();
としているものが同じになっているのか。
つまり、同じインスタンスなのかということを聞いたつもりなのですが。
(
CDragDrop6Dlg::OnDropFiles内で
CString s;
s.Format(_T("%p"), (void*)&dlg);
AfxMessageBox(s);
ものと
CKodomo1Dlg::OnOK内で
CString s;
s.Format(_T("%p"), (void*)this);
AfxMessageBox(s);
で同じかどうかで確認できるかな?
)
こんなのは当然落ちる。
class Hoge
{
public:
int* p;
Hoge() : p(NULL) {}
void Do() { *p = 1; }
};
int Func()
{
Hoge h;
int n;
h.p = &n;
}
int main()
{
Hoge h;
Func();
h.Do();
return 0;
}
Re:プログラム
Posted: 2009年3月10日(火) 14:20
by バグ
chkの型は何ですか?
CDragDrop6Dlgのヘッダを見せてください。
Re:プログラム
Posted: 2009年3月10日(火) 14:33
by ざこ
Public:
CDragDrop6Dlg(CWnd* pParent=NULL);
char *getFileName(char *lpszPath);
void reg_Number();
int show(int i);
int i;
int WriteReg(int index, char *reg);
int ReadReg(int index, char *reg);
CString s_ed1;
CString s_ed2;
int chk;
int registry;
です
Re:プログラム
Posted: 2009年3月10日(火) 14:39
by ざこ
同じじゃなかったです。
ファイルドロップの方が0012F718
OnOkのほうが0012F4C4でした
Re:プログラム
Posted: 2009年3月10日(火) 14:58
by Blue
>同じじゃなかったです。
では、どこで表示しているのでしょうか?
そこで、chk1に代入していなければNULLのままです。
>こんなのは当然落ちる。
と同じ。
Re:プログラム
Posted: 2009年3月10日(火) 16:08
by ざこ
>つまり、chk1を代入しているものと
CKodomo1Dlg::OnOK
で
*chk1=m_chk.GetCheck();
としているものが同じになっているのか。
つまり、同じインスタンスなのかということを聞いたつもりなのですが
うーん同じになっていないからうまくいかないんだとおもいます。
ところで 表示 って何の表示ですか? 出力のことなのか プログラムに表示されている内容なのかわかりません。
Re:プログラム
Posted: 2009年3月10日(火) 16:20
by Blue
ダイアログの表示(=DoModalもしくはShowWindow)なのですが。
CKodomo1Dlgを表示してOKボタンを押すってことではない?
Re:プログラム
Posted: 2009年3月10日(火) 16:26
by ざこ
その通りだと思います。
まずCDragDrop6Dlgクラスがメインです。【追加】ボタンをおすとCKodomo1Dlgがでてきます。
Re:プログラム
Posted: 2009年3月10日(火) 16:27
by ざこ
こんな状態になってます
こちらがCKodomo1です
Re:プログラム
Posted: 2009年3月10日(火) 16:41
by Blue
>【追加】ボタンをおす
関数があると思うのですが、そのなかはどうなっているんでしょうか?
>そこで、chk1に代入していなければNULLのままです。
# ということをNo:30376からずっといっているワケなんですが、、、
Re:プログラム
Posted: 2009年3月10日(火) 16:54
by ざこ
すいません。表示って概念が少しあやふやで理解しきっていませんでした。記述 ならもう少し理解が早かったと思います。追加ボタンの所に代入はしています。
Re:プログラム
Posted: 2009年3月10日(火) 16:57
by Blue
>追加ボタンの所に代入はしています。
だったらなぜNULLになるんでしょうか?
>そのなかはどうなっているんでしょうか?
というか、ポインタで持つ必要があるのかなぁと。
普通に戻ってきたときに取得できるような仕組みにしておけば無難だと思うんだけど。
Re:プログラム
Posted: 2009年3月10日(火) 17:00
by Blue
void CKodomo1Dlg::OnAddButton()
{
CKodomo1Dlg dlg;
dlg.chk1 = &chk;
if (dlg.DoModal() == IDOK) // ここでダイアログを表示
{
// OKボタンを押して戻ってきたときの処理
}
}
となっているのか否か。
Re:プログラム
Posted: 2009年3月10日(火) 17:06
by ざこ
すいません、きちんとできました。原因はへんなとこでchk1に代入していたようです。見落としていました。
ブルーさん長い間ありがとうございました。
Re:プログラム
Posted: 2009年3月10日(火) 17:11
by ざこ
なるほど、そういう意味の表示でしたか。私のは追加ボタン押したときに最初に変数の宣言をしその後に表示させていました。ですからタイミング的には正しい?と思います。