Код: Выделить всё
package org.example;
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class ArrayVarHandle {
static final StructLayout coordinateLayout = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y")
);
static final SequenceLayout arrayLayout = MemoryLayout.sequenceLayout(1, coordinateLayout);
static final VarHandle xInArrayVarHandle = arrayLayout.varHandle(
MemoryLayout.PathElement.sequenceElement(),
MemoryLayout.PathElement.groupElement("x")
);
public static void main(String[] args) {
try (var arena = Arena.ofConfined()) {
int count = 10;
var array = arena.allocate(coordinateLayout, count);
setXValues(array, count);
}
}
static void setXValues(MemorySegment array, int count) {
for (int i = 0; i < count; i++)
xInArrayVarHandle.set(array, 0, i, 100);
}
}
Код: Выделить всё
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
at org.example.ArrayVarHandle.setValues(ArrayVarHandle.java:30)
at org.example.ArrayVarHandle.main(ArrayVarHandle.java:24)
Если вместо этого он объявлен с elementCount = 999999, ошибка изменится:
Код: Выделить всё
Exception in thread "main" java.lang.IndexOutOfBoundsException: Out of bound access on segment MemorySegment{ address: 0x6000014b8140, byteSize: 80 }; new offset = 0; new length = 7999992
at org.example.ArrayVarHandle.setValues(ArrayVarHandle.java:30)
at org.example.ArrayVarHandle.main(ArrayVarHandle.java:24)
Можно ли создать массив/ макет последовательности без фиксированного размера? Или создать VarHandle по-другому?
В приведенном выше примере count имеет фиксированное значение. Но в реальном приложении счетчик неизвестен во время компиляции. И цель будет заключаться в том, чтобы создать экземпляр VarHandle один раз, а не при каждом вызове метода.
Подробнее здесь: https://stackoverflow.com/questions/791 ... namic-size