1

我正在使用这样的 for 循环创建一个 FloatBuffers 数组:

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[0]它的值之后,我打印了buffer[0].get(0),然后在给buffer[1]它的值之后,我再次打印了buffer[0].get(0),但是值已更改。它正在处理以前每个缓冲区 [0]、缓冲区 [1] 上的每个新缓冲区 [i] 的值...我不明白为什么会这样?

4

2 回答 2

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);
}
于 2013-03-21T18:43:00.560 回答
0

这就是JavaDOC中所说的

公共静态 FloatBuffer wrap(float[] 数组)

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 回答