2013-03-21 1 views
1

Я создаю массив FloatBuffers с цикл, как это:Создание массива 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 («буфер») каждый раз, когда эта линия (*). Например, после того, как буфер [0] получил свое значение, я напечатал буфер [0] .get (0), затем после того, как буфер [1] получил свои значения, я снова напечатал буфер [0] .get (0), но значение было изменено. Он справляется с значениями для каждого нового буфера [i] для каждого из предыдущих буферов [0], buffer [1] ... Я не понимаю, почему это происходит?

ответ

1

Метод FloatBuffer.wrap эффективно сохраняет переданный ему массив. Таким образом, все ваши буферы получат все значения, которые вы в последний раз обрабатываете в цикле for. Простым, но относительно дорогостоящим способом избежать этой проблемы было бы до System.arraycopy массива перед его переносом в каждый буфер.

Чтобы быть честным, вы должны просто использовать одно из семейств методов put, чтобы установить значения поплавка в буферы, пока вы их читаете из своего внешнего источника.

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); 
} 
+0

Спасибо за объяснение! И вы совершенно правы, я мог бы просто использовать «put» напрямую: buffer [i] .put (j, float value); Изменил его и отлично работает. –

0

Это то, что сказано в JavaDoc

общественности статической FloatBuffer завернуть (поплавок [] массив)

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