API Android OpenGL имеет тенденцию использовать комбинации массивов и смещений в тех местах, где C API будет использовать указатели. Есть ли что-нибудь в документации Android, чтобы сказать, что незаконно передавать один и тот же массив в качестве нескольких аргументов такой функции?
Я слишком долго отлаживал следующий (Kotlin) код :
val queryResults = IntArray(3)
GLES20.glGetActiveUniform(
handle, index, nameBuf.size,
queryResults, 0, // length
queryResults, 1, // size
queryResults, 2, // type
nameBuf, 0)
val length = queryResults[0]
val size = queryResults[1]
val type = queryResults[2]
Я надеялся избежать выделения двух массивов (и влечет за собой затирание пространства имен) путем повторного использования одного трехэлементного вектора для всех трех выходных параметров значения int. Но мне кажется, что на самом деле модифицируется только первый элемент массива. Второй и третий аргументы остаются в том значении, которое они имели до вызова функции. Почему?
В Android Kotlin документации ничего не говорится, кроме сигнатуры функции и имен аргументов. Java версия больше не нужна. Документация OpenGL описывает функцию с точки зрения трех отдельных указателей без дополнительных требований.
У меня есть исправление, заключающееся в использовании одного массива для каждого выходного аргумента, но я действительно хотел бы понять зачем это нужно. Во всем переводе API может быть что-то, чего я не понимаю, и это мне пригодится, когда я буду продолжать работать с ним.
val lengthBuf = IntArray(1)
val sizeBuf = IntArray(1)
val typeBuf = IntArray(1)
GLES20.glGetActiveUniform(
handle, index, nameBuf.size,
lengthBuf, 0, // length
sizeBuf, 0, // size
typeBuf, 0, // type
nameBuf, 0)
val length = lengthBuf[0]
val size = sizeBuf[0]
val type = typeBuf[0]