2016-09-07 6 views
1

配列を充填するときに重大な問題があります。私の機能は、次のようになります。充填配列が予期しない値を与える

int s_in[]; /* Array filled with a lot of integer values */ 
for(frame=0; frame<maxFrames; frame++){ 
    left = 240*(frame-1) + 1; 
    right = 240*(frame +1); 
    int x[right-left+1]; /* is always 480 long */ 

    for(i=left-1;i<right;i++){ 
    x[i] = s_in[i]; 
    } 

私は今、各実行のためのx []に格納された値をプリントアウトしようとすると、私はよく得るいずれかの空のx []またはには表示されませんいくつかのランダムな数字罪[]。 この問題は、何らかの種類のメモリ管理で解決できますか?

+0

申し訳ありません、C言語です。 – Alex

+0

あなたは 's_in'に何を入れているのか教えてください。 – byxor

+0

ここで 'x'を印刷しています。ループのための 'frame'の内側か、それとも外側か? –

答えて

1

ラインに2つの問題がありますaboceラインが実行される非常に最初の繰り返しで

x[i] = s_in[i]; 

、値のは、変数は次のとおり

frame: 0 
left: -239 
i:  -240 

コードはs_in[]の境界の外部から読み取る及びx[]の境界の外側に書き込みを書き込もう。

これはundefined behaviourです。

s_in[]に情報がどのように配置されているかを知らなくても、コードを修正するのは難しいです。フレームと仮定すると240バイトであり、あなたがx[]s_in[]から2つの連続するフレームの値をコピーしたい各反復で、コードは、これらの線に沿って何かになります。それぞれにright-left+1を計算するにはポイントがありません

int s_in[]; /* Array filled with a lot of integer values */ 
for (frame = 1; frame < maxFrames; frame ++) { 
    left = 240 * (frame - 1);  /* the first value of the previous frame */ 
    right = 240 * (frame + 1);  /* the first value of the next frame */ 
    int x[480];      /* is always 480 long */ 

    for (i = 0; i < 480; i ++) { 
    x[i] = s_in[left + i]; 
    } 
} 

をあなたはすでにそれが480でなければならないことを知っているので繰り返します。上のコードからわかるように、rightという値は必要ありません。

外側ループはframe = 0で開始する必要がありますが、フレーム#0では、違反行は外部からの読み取りを試みますs_in[];これがフレーム#1で始まる理由です。

内側のループの内部でさらに処理するとします。それ以外の場合は、memcpy(&x, &s_in[left], 480);への呼び出しで置き換えることができます。 forループの現在の状態と同じですが、はるかに速く実行されます。

+0

ありがとうございました!私はコードを変更し、あなたの提案を適用しました。今ではフレーム253にセグメンテーション違反が発生していますが、なぜか分かりません。私はx []の値をプリントアウトしようとするとエラーが発生します。私は確信しています、s_in []はこのフレーム内に埋め込まれていますが、x []配列を読み込んで印刷しようとすると、セグメンテーション違反が発生するだけです。 – Alex

1

アルゴリズムはx配列の境界から外れます。フレームを反復処理すると、x配列の最大サイズよりも長い値が得られ、メモリ上に予約されていないx位置にアクセスしようとします。常に配列が範囲外にある場合、Cはチェックしないことを覚えておいてください