1

次のようなforループを使用してFloatBufferの配列を作成しています。

FloatBuffer[] buffer = new FloatBuffer[sizebuffer];

float[] farray = new float[sizeArray];

for(int i=0;i<sizebuffer;i++){
    for(int j=0;j<sizeArray;j++){

     farray[j]= I get the float values from other buffer....
    }

    buffer[i]= FloatBuffer.wrap(farray);  (*)

}

ただし、何らかの理由で、この行(*)が実行されるたびに、FloatBuffer配列( "buffer")の各行の値が変更されます。たとえば、buffer [0]に値を指定した後、buffer [0] .get(0)を出力し、buffer [1]に値を指定した後、buffer [0] .get(0)を再度出力しましたが、値が変更されました。以前のバッファ[0]、バッファ[1]のそれぞれの新しいバッファ[i]の値を処理しています...なぜこれが発生するのかわかりませんか?

4

2 に答える 2

1

このFloatBuffer.wrapメソッドは、渡された配列を効果的に保持します。したがって、すべてのバッファーは、forループで最後に処理した値になります。この問題を回避するための単純ですが比較的費用のかかる方法はSystem.arraycopy、各バッファーでラップする前に配列を使用することです。

正直なところ、put外部ソースから値を読み取っている間は、一連のメソッドの1つを使用してfloat値をバッファーに設定する必要があります。

for(int i=0;i<sizebuffer;i++){
    for(int j=0;j<sizeArray;j++){
        farray[j]= some value from other buffer....
    }

    buffer[i]= FloatBuffer.allocate(farray.length);
    buffer[i].put(farray);
}
于 2013-03-21T18:43:00.560 に答える
0

これはJavaDOCで述べられていることです

public static FloatBuffer wrap(float [] array)

Wraps a float array into a buffer.

The new buffer will be backed by the given float array; that is, **modifications to the buffer will cause the array to be modified and vice versa.** The new buffer's capacity and limit will be array.length, its position will be zero, and its mark will be undefined. Its backing array will be the given array, and its array offset will be zero.

Parameters:
    array - The array that will back this buffer 
Returns:
    The new float buffer
于 2013-03-21T18:43:24.333 に答える