いつもお世話になっております。
今回質問させていただきたいのは、for文を用いたループ処理です。
下記のように同じようなプログラムをループによってまとめたいんですが、
変数が多すぎてどのようにしたらよいのか、苦戦しております。
このように変数がいろいろ多くてもループ処理は可能なのでしょうか?
ご教授お願いいたします。
if(DLG==1)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);
strcpy(element[0].name , name);
strcpy(element[0].value , value);
}
else if(DLG==2)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);
strcpy(element[0].name , Cname);
strcpy(element[0].value , Cvalue);
}
/ *************************************************************************************/
if(DLG==11)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);
strcpy(element[1].name , name);
strcpy(element[1].value , value);
}
else if(DLG==12)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);
strcpy(element[1].name , Cname);
strcpy(element[1].value , Cvalue);
}
/****************************************************************************************/
if(DLG==21)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);
strcpy(element[2].name , name);
strcpy(element[2].value , value);
}
else if(DLG==22)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);
strcpy(element[2].name , Cname);
strcpy(element[2].value , Cvalue);
/**********************************************************************************************/
}if(DLG==31)
{
DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc);
strcpy(element[3].name , name);
strcpy(element[3].value , value);
}
else if(DLG==32)
{
DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc);
strcpy(element[4].name , Cname);
strcpy(element[4].value , Cvalue);
}
/************************/ と /*****************************/で囲まれた部分の繰り返しです。
for文を用いたループについて
Re:for文を用いたループについて
コードの流れからいって、最後のelement[4]はelement[3]なのでは?
ダイアログボックスの処理内容次第で変数DLGの値が変わるのでしょうか...。
それによってループもサブルーチンも変わるので、詳しく書いてください。
関数DialogBox()は閉じるまで制御が返らないので、普通の関数同様の感覚で使ってよいと思います。
ループを組みたい位置も/******/がみっつあるのでもう少し詳しく+判りやすくお願いします。
疑問点もあげておきます。
(1)if~else if 文においてデフォルトの処理は必要ないのですか?
(2)関数DialogBox()の戻り値は必要ないのですか?
あと、できれば上記コードにおける関数copy_struct()は、できるだけ関数DialogBox()内で処理させましょう。
あ、もしかして
void copy_struct(struct* element, char* szName, char* szValue) { strcpy(element->name, szName); strcpy(element->value, szValue); } void ShowDlgR(int n) { DialogBox(hCurInst, "REACTDLG", NULL, (DLGPROC)ReactDlgProc); copy_struct(element + n, name, value); } void ShowDlgC(int n) { DialogBox(hCurInst, "CONDENSADLG", NULL, (DLGPROC)CondensaDlgProc); copy_struct(element + n, Cname, Cvalue); } (コード本体) { if (DLG == 1) ShowDlgR(0); else if (DLG == 2) ShowDlgC(0); if (DLG == 11) ShowDlgR(1); else if (DLG == 12) ShowDlgC(1); if (DLG == 21) ShowDlgR(2); else if (DLG == 22) ShowDLgC(2); if (DLG == 31) ShowDlgR(3); else if (DLG == 32) ShowDlgC(4); // 本当はShowDlgC(3)? }このように、コードは短くできます。
ダイアログボックスの処理内容次第で変数DLGの値が変わるのでしょうか...。
それによってループもサブルーチンも変わるので、詳しく書いてください。
関数DialogBox()は閉じるまで制御が返らないので、普通の関数同様の感覚で使ってよいと思います。
ループを組みたい位置も/******/がみっつあるのでもう少し詳しく+判りやすくお願いします。
疑問点もあげておきます。
(1)if~else if 文においてデフォルトの処理は必要ないのですか?
(2)関数DialogBox()の戻り値は必要ないのですか?
あと、できれば上記コードにおける関数copy_struct()は、できるだけ関数DialogBox()内で処理させましょう。
あ、もしかして
(コード本体) { int i; for(i = 0; i < 4; i++) { if (DLG == i * 10 + 1) ShowDlgR(i); else if (DLG == i * 10 + 2) ShowDlgC(i); // (i)のところを、((i == 3) ? 4 : i) } }ということですか?
Re:for文を用いたループについて
質問の内容不足だったようで、申し訳ございませんでした。
やりたかった事は、同じような処理を100個ほど書かなくてはならなかった為、
ループにてまとめれないか?という疑問でした。
しかし、PKさんの
>
> for(i = 0; i < 4; i++)
> {
> if (DLG == i * 10 + 1) ShowDlgR(i);
> else if (DLG == i * 10 + 2) ShowDlgC(i); // (i)のところを、((i == 3) ? 4 : i)
> }
を参考にさせていただきましたおかげで、
上手く出来ました。
本当にありがとうございました。
またこれからもC言語頑張らせていただきます。
やりたかった事は、同じような処理を100個ほど書かなくてはならなかった為、
ループにてまとめれないか?という疑問でした。
しかし、PKさんの
>
> for(i = 0; i < 4; i++)
> {
> if (DLG == i * 10 + 1) ShowDlgR(i);
> else if (DLG == i * 10 + 2) ShowDlgC(i); // (i)のところを、((i == 3) ? 4 : i)
> }
を参考にさせていただきましたおかげで、
上手く出来ました。
本当にありがとうございました。
またこれからもC言語頑張らせていただきます。