プログラム

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

プログラム

#1

投稿記事 by ざこ » 16年前

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に伝えようとしています
。何故エラーになるのでしょうか。エラー内容は

"問題が発生しました。 プログラムを終了します" です。おしえてください

Blue

Re:プログラム

#2

投稿記事 by Blue » 16年前

>dlg.chk1=&chk;
chkってどこに宣言されているの?


CKodomo1Dlgのコンストラクタでchk1をNULLで初期化して、
CKodomo1Dlg::OnOK() でchk1がNULLでないことを確かめてみては?

ASSERT(chk1 != NULL);

バグ

Re:プログラム

#3

投稿記事 by バグ » 16年前

まずは問題のある箇所にブレイクポイントを設定して、chk1に元の変数のアドレスがきちんと格納されているかを確認してみてください。

バグ

Re:プログラム

#4

投稿記事 by バグ » 16年前

あ、Blueさんと被ってしまいました。すみません(^_^;)

ざこ

Re:プログラム

#5

投稿記事 by ざこ » 16年前

あ・・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:プログラム

#6

投稿記事 by ざこ » 16年前

問題のある箇所
*chk1=m_chk.GetCheck()の部分にブレークポイント置いて
chk1の中身をみると0x0000000で、これより下にいこうとすると
ハンドルされていない例外 は ●●.exeにあります とでます

Blue

Re:プログラム

#7

投稿記事 by Blue » 16年前

Debug Assertion Failed! のダイアログで「再試行」を選ぶとASSERTの記述のある行に
飛ぶことができます。
そこでローカルウィンドウでもウォッチでもいいのでchk1の値を確認してみてはどうでしょうか?


>>>dlg.chk1=&chk;
>>chkってどこに宣言されているの?
>あ・・chk1はダイアログAのヘッダに入ってます。
回答になっていません。chk1ではなくchkです。


それと、タイトルはもう少しましなものをつけましょう。
だいたいすべての質問がプログラムに関してですから。

バグ

Re:プログラム

#8

投稿記事 by バグ » 16年前

>>chk1の中身をみると0x0000000で、これより下にいこうとすると

chk1にきちんとアドレスが格納されていないようですね。これが原因です。

ざこ

Re:プログラム

#9

投稿記事 by ざこ » 16年前

その方法でもchk1の中身は0x000000でした。

X chk1
○  chkでした。
記述ミスです

タイトルのことですが今回は特に特定の関数を使うものじゃないですから
つけるとしてもMFCプログラム とかでしょうか。

Blue

Re:プログラム

#10

投稿記事 by Blue » 16年前

>CKodomo1Dlg dlg;
>dlg.chk1=&chk;
っていつ表示しているの?
表示している箇所が見当たらないけど。
CDragDrop6Dlg::OnDropFiles内の
dlgのchk1に値を入れているわけなのでそれ以外で表示しようとしてもNULLになるに決まっています。

>つけるとしてもMFCプログラム とかでしょうか。
違いますね。


>*chk1=m_chk.GetCheck(); で止まってしまいます。
>"問題が発生しました。 プログラムを終了します" です。おしえてください
という趣旨が伝わるようなタイトルにします。
たとえば、

ポインタに値を代入しようとすると「問題が発生しました。」になってしまう

とか。

ざこ

Re:プログラム

#11

投稿記事 by ざこ » 16年前

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:プログラム

#12

投稿記事 by ざこ » 16年前

原因の方はわかりましたが何故アドレスが渡っていないかですね・・

Blue

Re:プログラム

#13

投稿記事 by Blue » 16年前

再度
>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:プログラム

#14

投稿記事 by バグ » 16年前

chkの型は何ですか?
CDragDrop6Dlgのヘッダを見せてください。

ざこ

Re:プログラム

#15

投稿記事 by ざこ » 16年前

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:プログラム

#16

投稿記事 by ざこ » 16年前

同じじゃなかったです。
ファイルドロップの方が0012F718
OnOkのほうが0012F4C4でした

Blue

Re:プログラム

#17

投稿記事 by Blue » 16年前

>同じじゃなかったです。
では、どこで表示しているのでしょうか?
そこで、chk1に代入していなければNULLのままです。

>こんなのは当然落ちる。
と同じ。

ざこ

Re:プログラム

#18

投稿記事 by ざこ » 16年前

>つまり、chk1を代入しているものと
CKodomo1Dlg::OnOK

*chk1=m_chk.GetCheck();
としているものが同じになっているのか。

つまり、同じインスタンスなのかということを聞いたつもりなのですが

うーん同じになっていないからうまくいかないんだとおもいます。
ところで 表示 って何の表示ですか? 出力のことなのか プログラムに表示されている内容なのかわかりません。

Blue

Re:プログラム

#19

投稿記事 by Blue » 16年前

ダイアログの表示(=DoModalもしくはShowWindow)なのですが。
CKodomo1Dlgを表示してOKボタンを押すってことではない?

ざこ

Re:プログラム

#20

投稿記事 by ざこ » 16年前

その通りだと思います。
まずCDragDrop6Dlgクラスがメインです。【追加】ボタンをおすとCKodomo1Dlgがでてきます。

ざこ

Re:プログラム

#21

投稿記事 by ざこ » 16年前

こんな状態になってます
こちらがCKodomo1です

Blue

Re:プログラム

#22

投稿記事 by Blue » 16年前

>【追加】ボタンをおす
関数があると思うのですが、そのなかはどうなっているんでしょうか?
>そこで、chk1に代入していなければNULLのままです。


# ということをNo:30376からずっといっているワケなんですが、、、

ざこ

Re:プログラム

#23

投稿記事 by ざこ » 16年前

すいません。表示って概念が少しあやふやで理解しきっていませんでした。記述 ならもう少し理解が早かったと思います。追加ボタンの所に代入はしています。

Blue

Re:プログラム

#24

投稿記事 by Blue » 16年前

>追加ボタンの所に代入はしています。
だったらなぜNULLになるんでしょうか?
>そのなかはどうなっているんでしょうか?

というか、ポインタで持つ必要があるのかなぁと。
普通に戻ってきたときに取得できるような仕組みにしておけば無難だと思うんだけど。

Blue

Re:プログラム

#25

投稿記事 by Blue » 16年前

void CKodomo1Dlg::OnAddButton()
{
	CKodomo1Dlg dlg;
	dlg.chk1 = &chk;
	if (dlg.DoModal() == IDOK) // ここでダイアログを表示
	{
		// OKボタンを押して戻ってきたときの処理
	}
}
となっているのか否か。

ざこ

Re:プログラム

#26

投稿記事 by ざこ » 16年前

すいません、きちんとできました。原因はへんなとこでchk1に代入していたようです。見落としていました。
ブルーさん長い間ありがとうございました。

ざこ

Re:プログラム

#27

投稿記事 by ざこ » 16年前

なるほど、そういう意味の表示でしたか。私のは追加ボタン押したときに最初に変数の宣言をしその後に表示させていました。ですからタイミング的には正しい?と思います。

閉鎖

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