2009-06-16 13 views
0

以下のコードでエラーが表示されます。「インデックスが配列の範囲外です」私のアルゴリズムは、配列dimention '16'、 のColorset配列を作成しますが、私は2番目の 'colorSetLegend'の寸法が必要です。以下カラー配列を別のカラー配列に設定する方法は?

Color[] colorSetLegend = new Color[32]; 
      Color[] colorSet = { Color.Red, Color.Blue, Color.Green, Color.Yellow }; 
      Color end = Color.White; 
      colorSet = ColorMaker.GenerateColor(colorSet, end); 

      for (int i = 0; i < colorSet.Length;) 
      { 
       for (int j = 0; j < colorSetLegend.Length;) 
       { 
        colorSetLegend[j] = colorSet[i]; 
        colorSetLegend[j++] = Color.Black; 
        i++; 
       } 
      }

マイカラージェネレータ:


public class ColorMaker 
{ 
    public static Color[] GenerateColor(Color[] baseColorSet, Color end) 
    { 
     Color[] colorSet = new Color[16]; 
     int j = 0; 
     foreach (Color start in baseColorSet) 
     { 
      for (int i = 0; i < 15; i += 4) 
      { 
       int r = Interpolate(start.R, end.R, 15, i), 
        g = Interpolate(start.G, end.G, 15, i), 
        b = Interpolate(start.B, end.B, 15, i); 

       colorSet[j] = Color.FromArgb(r, g, b); 
       j++; 
      } 
     } 

     return colorSet; 

    } 
    static int Interpolate(int start, int end, int steps, int count) 
    { 
     float s = start, e = end, final = s + (((e - s)/steps) * count); 
     return (int)final; 
    } 
} 

答えて

2

はあなたのインナーループでIをインクリメントしています。 アウターループでそれを行うことが意図されていると思われます。そうでなければ、のうち1回アウターループを繰り返します。アレイの境界を超えるまで、iを何度もインクリメントしています。

また、あなたはあなたのforは誰もが同じ方法をループ書くことができます:

for (int i = 0; i < colorSet.Length; i++) 
{ 
    for (int j = 0; j < colorSetLegend.Length; j++) 
    { 
     colorSetLegend[j] = colorSet[i]; 
     colorSetLegend[j] = Color.Black; 
    } 
} 

は、コードがループ内の最初の行はcolorSetLegend[j]、2行目のセットを設定することを与えられたビット無意味だ、と言ったの再び同じ要素さらに、外側ループの次の反復では、colorSetLegendのすべての値をもう一度上書きします。あなたは何を達成しようとしていますか?

for (int i = 0; i < colorSet.Length; i++) 
{ 
    colorSetLegend[i*2] = colorSet[i]; 
    colorSetLegend[(i*2)+1] = Color.Black; 
} 

にいくつかのこと:(!彼は今、彼の答えを削除していますが)

マルク・ここにあなたの目的で格好良い推測をした

をここで何をしたいのために働くのコードで彼の推測です彼が正しいのであれば、これから学ぶ:

  • あなたのループの入れ子のレベルについて考えてみましょう。ここに2つのループがあるのは本当ですか?
  • ループのための従来のイディオムを使用してみてください - 私はforループの開始の最後に空のビットを見るたびに、私は緊張し、別の表現で前後インクリメント演算子を使用して
  • は間違って取得することは簡単です。
+0

ForExample。 colorSetLegend [0] = "赤"; colorSetLegend [1] = Color.Black; colorSetLegend [2] = "FireBrick"; colorSetLegend [3] = Color.Black; – Penguen

+0

Marcの推測のような音が当時だった。私の編集された答えを見てください。 –

0

これは、あなたが探しているものを達成します:

int j = 0; 
for (int i = 0; i < colorSet.Length; i++) 
{ 
    colorSetLegend[j++] = colorSet[i]; 
    colorSetLegend[j++] = Color.Black; 
} 
+0

これはうまくいきますが、私は文の中で前/後のインクリメントを使用しないので、Marcの答え(今は私のものにコピーされています)を好む。それはいつも私を止めて、本当に必要なことをやっていることを確認します。可能であれば、可読性を損なうものは避けてください。 –

関連する問題