2012-04-08 21 views
1

をマージするときに乱数を取得:Iは、例えば1に2つの配列をマージする2配列

  • をA1 = 1,1
  • A2 = 2,2
  • 次いで、A3 = 1、たとえば2,1,2

  • A1 = 1
  • A2 = 2,2,2,2
  • 次いでA3 =たとえば1,2,2,2,2

  • A1 = 1,1,1,1
  • 私は自分のコードを実行したときに
  • A2 = 2,2
  • は、A3 = 1,2,1,2,1,1
  • 最後の例では

、私は、1,2,1,2を得ました1,20。

2番目に私は1,2,32767,2,2を得ました。

私は間違ったコードを持っていると思います。直後に、私は短い配列の要素を取り、A3の残りの部分を誰でも長くしていった。しかし、私はなぜ—あなたが私を助けることができるのか分かりませんでしたか?

コード:

int *p3=arr3; //arr3 is A3 for example, arr1 = A1..etc, all sizes are defined 
int index; 
int index1=0; 
int index2=0; 

for(index = 0; index< sizeofArr3 ; index++) 
{ 
    if(index%2==0) 
    { 
     if(index1<=sizeofArr1) 
      *(p3++) = arr1[index1++]; 
     else 
      *(p3++) = arr2[index2++]; 
    } 
    else 
    { 
     if(index2<=sizeofArr2) 
      *(p3++) = arr2[index2++]; 
     else 
      *(p3++) = arr1[index1++]; 
    } 
} 

答えて

3

それはこの行です:

if (index1 <= sizeofArr1) 

index2sizeofArr2の等価1。 <=ではなく<を使用する必要があります。

理由は、Cのゼロベースの配列と関係があります。サイズがNの配列の場合、要素インデックスは0からN-1までです。要素NN+1番目の要素)にアクセスできるようにしているため、実際には未定義の動作が呼び出されています。

この場合、実装は宇宙の破壊までを含めて何でも行うことができます。そのsizeofArr1と仮定すると、

if (index1 < sizeofArr1) 

<ではなく<=で:私はあなたはそれがあなたにループ内のテストがあるべき

1

:-)少しゆがんでいた結果を与えることを決めたことを幸運だと思います配列内の最大有効インデックスではなく、配列内の要素数のカウントです。配列が同じ長さの場合、この不一致は問題ではありません(最初の配列はOKです)が、配列の長さが異なる場合は問題ありません。

2

< = sizeOfArr1と2は実際には< sizeOfArr1と2です。どのようにあなたのサイズを計算していますか?

関連する問題