for文を用いたループについて

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

for文を用いたループについて

#1

投稿記事 by Cげんが~ » 16年前

いつもお世話になっております。
今回質問させていただきたいのは、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);


}

/************************/ と /*****************************/で囲まれた部分の繰り返しです。

PK

Re:for文を用いたループについて

#2

投稿記事 by PK » 16年前

コードの流れからいって、最後のelement[4]はelement[3]なのでは?
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)
    }
}
ということですか?

Cげんが~

Re:for文を用いたループについて

#3

投稿記事 by Cげんが~ » 16年前

質問の内容不足だったようで、申し訳ございませんでした。
やりたかった事は、同じような処理を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言語頑張らせていただきます。

閉鎖

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