VarHandle для массивов динамического размераJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 VarHandle для массивов динамического размера

Сообщение Anonymous »

Как создать экземпляр VarHandle для доступа к элементам массива с динамическим размером (в контексте API внешних функций и памяти)?

Код: Выделить всё

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)
Очевидно, он проверяет границы макета arrayLayout. Он объявлен с помощью elementCount = 1 (первый параметр).
Если вместо этого он объявлен с 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • VarHandle для массивов динамического размера
    Anonymous » » в форуме JAVA
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • VarHandle для массивов динамического размера
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Существует ли библиотека C++, реализующая кольцевой буфер массивов динамического размера? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • VarHandle для сегмента внешней памяти Java без проверки границ в Java 21
    Гость » » в форуме JAVA
    0 Ответы
    36 Просмотры
    Последнее сообщение Гость
  • Где найти реализацию java.lang.invoke.VarHandle.compareAndSet()?
    Anonymous » » в форуме JAVA
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»