0

実際、私はif else条件を減らそうとしていますが、Cでの方法がわかりません。

たとえば、私のコードは

 if(this.Index==1100 && this.SubIndex==1)
 {
 putValue(Com_stMECUErr,this.Data);
  }

 else if(this.Index==1100 && this.SubIndex==2)
  {
  putValue(B_sbbvk,this.Data);
   }

 else if(this.Index==1100 && this.SubIndex==3)
  {
 putValue(Com_bMSVIdle,this.Data);
   }

  // haivng 100 more similar conditions

   }
4

7 に答える 7

5

値が連続範囲内にある場合:

yourtypehere subIndexValues[] = {whatever, Com_stMECUErr, B_sbbvk, Com_bMSVIdle};

if(this.Index==1100)
{
  putValue(subIndexValues[this.SubIndex],this.Data);
}

ifまたは、インデックスに s を組み合わせて使用case​​し、特定の範囲に s/arrays を使用することもできます。

于 2012-06-19T09:43:20.033 に答える
3

次のように、冗長性の一部を取り除くことができます。

if (this.Index == 1100)
{
    switch (this.SubIndex)
    {
        case 1:
            putValue(Com_stMECUErr, this.Data);
            break;
        case 2:
            putValue(B_sbbvk, this.Data);
            break;
        case 3:
            putValue(Com_bMSVIdle, this.Data);
            break;
        ...
        default:
            ...
            break;
    }
}
于 2012-06-19T09:43:15.247 に答える
2

SubIndex が特定の値にマップされない場合は、if または switch を使用します。

これがifの方法です。

if(this.Index == 1100) {
    if (this.SubIndex==1) putValue(Com_stMECUErr, this.Data);
    if (this.SubIndex==2) putValue(B_sbbvk, this.Data);
    if (this.SubIndex==3) putValue(Com_bMSVIdle,this.Data);
    // 100's more if's 
} else { //if this.Index != 1100
}

これが切り替え方法です。

if(this.Index == 1100) {
    switch(this.SubIndex) {
        case 1: putValue(Com_stMECUErr, this.Data); break;
        case 2: putValue(B_sbbvk, this.Data); break;
        case 3: putValue(Com_bMSVIdle,this.Data); break;
        // 100's more cases
        default: break;
    }
    // 100's more if's 
} else { //if this.Index != 1100
}

SubIndex が特定の値にマップされる場合は、配列を使用して最短の方法で行うことができます。

YourDataType values[] = {
    whatever, 
    Com_stMECUErr, 
    B_sbbvk, 
    Com_bMSVIdle, 
    hundredsmore
}
if(this.Index == 1100) {
    putValue(values[this.SubIndex], this.Data);
}
于 2012-06-19T09:52:34.363 に答える
1
if (this.Index==1100) {
  if (this.SubIndex==1)
    putValue(Com_stMECUErr, this.Data);
  if (this.SubIndex==2)
    putValue(B_sbbvk, this.Data);
  if (this.SubIndex==3)
    putValue(Com_bMSVIdle,this.Data);
  // haivng 100 more similar conditions
}

または何かのような

if (this.Index==1100) {
  the_type_of_the_first_argument_of_putValue table1100[]= {
    Com_stMECUErr, // 1
    B_sbbvk,       // 2
    Com_bMSVIdle   // 3
    // haivng 100 more similar conditions
  };
  if (this.SubIndex<=no_of_entries_in_table1100)
    putValue(table1100[this.SubIndex-1], this.Data);
  else
    printf("value not found.");
}
于 2012-06-19T09:43:02.610 に答える
0

この場合、this.Index == 1100 を確認してから、switch ステートメントを使用してサブインデックスをテストできます。

つまり、すべての条件に共通のチェックがあるため、それを抽出できます。

if (this.Index==1100){
  switch(this.Subindex){
    case 1:
      ...
    case 2:
      ...
    }
}
于 2012-06-19T09:40:56.993 に答える
0

switch ステートメントを使用し、if ステートメントを 1 つ上に移動することで、コードを短縮できます。

if (this.Index == 1100) {
    switch(this.SubIndex) {
    case 1:
        putValue(Com_stMECUErr,this.Data);
        break;
    case 2:
        putValue(B_sbbvk,this.Data);
        break;
    case 3:
        putValue(Com_bMSVIdle,this.Data);
        break;
    default:
        break;
    }
}
于 2012-06-19T09:43:21.813 に答える
0

各 SubIndex は特定の値にマップされますか?

その場合、マッピングを追跡する HashMap または類似のものを作成できます。それを行った場合、値を確認する必要があるときはいつでも、次のようにすることができます。

if(this.Index == 1100){
    putValue(someMap.get(this.SubIndex), this.Data);
}

このようにすると、特にコードのさまざまな部分でマッピングを複数回チェックする必要がある場合に、多くのコードを節約できます。

于 2012-06-19T09:45:02.403 に答える