0

これを行う方法があるかどうかはわかりません。私の宿題はそう言っていますが、そのような方法はないと確信していました:

    CStringArray m_Last;
    int size = m_Last.GetCount();

    // In the .h file I have,

     #define IDM_LAST 90// these are to be used for contiguous Resource ID's
     const int MAXLAST = 5; // there are 5 Resource IDs

    for(int i = 0, j = IDM_LAST; i < size, j < IDM_LAST + MAXLASTUSEDDEST; ; i++, j++)
    {
        menuAPopup.AppendMenu(MF_STRING, j, m_Last.ElementAt(i));
    }

for ループに 1 つの変数を使用する方法がありiますj

4

3 に答える 3

4

問題はここにあります:

i < size, j < IDM_LAST + MAXLASTUSEDDEST

,条件の をに変更する必要があり&&ます。


要するに、これがどのように機能するかforです:

for (X; Y; Z)
{
    ...
}

に変換します。

X;
while (Y)
{
    ...
    Z;
}

で定義された変数を除きX、 のスコープになりwhileます。

以下は有効な C コードであるため:

int i = 0, j = IDM_LAST;
while (i < size && j < IDM_LAST + MAXLASTUSEDDEST)
{
    menuAPopup.AppendMenu(MF_STRING, j, m_Last.ElementAt(i));
    i++, j++;
}

次に、これforも有効です。

for(int i = 0, j = IDM_LAST; i < size && j < IDM_LAST + MAXLASTUSEDDEST; i++, j++)
{
    menuAPopup.AppendMenu(MF_STRING, j, m_Last.ElementAt(i));
}

必ずしも変数の数を減らす必要はありませんが、どうしても減らそうとする場合は、次のようにします。

よく見ると、jは常に に等しいことがわかりi + IDM_LASTます。したがって、これを次のように置き換えることができますfor

for(int i = 0; i < size && i + IDM_LAST < IDM_LAST + MAXLASTUSEDDEST; i++)
{
    menuAPopup.AppendMenu(MF_STRING, i + IDM_LAST, m_Last.ElementAt(i));
}

単純化:

for(int i = 0; i < size && i < MAXLASTUSEDDEST; i++)
{
    menuAPopup.AppendMenu(MF_STRING, i + IDM_LAST, m_Last.ElementAt(i));
}
于 2012-08-17T18:44:12.363 に答える
2

と の2 つの終了条件がi < sizeありj < IDM_LAST + MAXLASTUSEDDESTます。i < sizeさて: を の観点からどのように書き換えますjか? それを取得したらi、ループ本体で同様に を置き換えることができるはずですj

i両方とも、j反復ごとに常に 1 ずつ増加することに注意してください。初期化のため、これは各反復で:j == (i + IDM_LAST)が true であることを意味します。

与えられたループに関しては、それはそのままでは正しくありません: 終了条件でコンマ演算子を使用していますが、それはあなたが望むことをしません: の結果はi < size無視されます! ループを次のように変更します。

int i, j;
for (i = 0, j = IDM_LAST; (i < size) && (j < IDM_LAST + MAXLASTUSEDDEST); i++, j++)
于 2012-08-17T18:44:21.057 に答える
0
 CStringArray m_Last;
 int size = m_Last.GetCount();

 // In the .h file I have,

 // last of the contiguous Resource block ID's
 #define IDM_LAST 90
 // there are 5 Resource IDs only
 const int MAXLAST = 5;

 for (int i=0 ; (i<size)&&(i<MAXLAST) ; i++)
 {
    menuAPopup.AppendMenu(MF_STRING, (IDM_LAST - i), m_Last.ElementAt(i));
 }
于 2012-08-19T00:08:00.813 に答える