Как правильно передать адрес массива в Clarion?
Прототип:
myFunction( ULONG , *ULONG ),PASCAL
Переменные:
myArray ULONG, DIM(30)
myStuff ULONG
Код:
...
myFunction(myStuff, myArray)
...
Ошибка:
Нет подходящего прототипа - C:...
Что-то не так с самим прототипом или я передаю переменную неправильно?
Для более подробной информации, настоящая рассматриваемая функция - glSelectBuffer( GLsizei, *GLuint),PASCAL
Где GLSizei приравнивается к ULONG, а GLuint приравнивается к ULONG.
Возможно ли, что уравнения вызывают сбой в системе? Я бы так не думал, потому что до сих пор не было других проблем с адаптацией других функций для совместимости с Clarion, но эта, в частности, была чрезвычайно хлопотной. Функция ищет массив определенного пользователем размера для использования в качестве буфера для хранения данных выбора. Я подумал, что будет достаточно просто создать буфер (см.: myArray ULONG, DIM(30)), а затем просто передать переменную, поскольку она должна передавать адрес массива, но пока это приводило только к ошибке компиляции, указанной выше,
Любая помощь будет принята с благодарностью.
3 ответа
приравнивает:
GLsizei EQUATE(ULONG)
GLuint EQUATE(ULONG)
Прототип:
glSelectBuffer( GLsizei , *GLuint ),PASCAL
Данные:
mySelectionBuffer &STRING
myBufferPointer &ULONG
curSelection ULONG
В этом:
mySelectionBuffer &= NEW(STRING(30))
myBufferPointer &= ADDRESS(mySelectionBuffer)
Использование:
![glSelectBuffer(Size of Buffer Array, Pointer to Buffer)
glSelectBuffer(30, myBufferPointer)
Затем для сбора данных:
...
LOOP i# = 1 TO numHits ![result of glRenderMode(GL_RENDER)]
curSelection = ADDRESS(mySelectionBuffer) + (SIZE(curSelection) * i#)
.
![Process selection data as needed]
...
Неисправность:
DISPOSE(mySelectionBuffer)
Некоторые, вероятно, будут утверждать, что это был не лучший способ решения проблемы, однако, в конце концов, это было единственное решение, с которым я столкнулся, которое не только компилировалось, но и впоследствии не приводило к сбоям на стороне OpenGL после передачи данных обратно. к этому. Я бы предпочел не играть с памятью, чтобы выполнить мою задачу, но кажется, что при работе с функциями в других API это просто неизбежно...
Правильный подход - просто поместить [] в прототип. Например, следующая программа компилируется нормально.
PROGRAM
myArray ULONG, DIM(30)
myStuff ULONG
MAP
myFunction( ULONG , *ULONG[] ),PASCAL
END
CODE
myFunction(myStuff,myArray)
myFunction Procedure(a,b)
code
Когда все не удается, вы можете создать прототип параметра как LONG
и передать в нем ADDRESS
переменной, что-то вроде:
Прототип:
myFunction( ULONG , LONG ),PASCAL
Код:
...
myFunction(myStuff, ADDRESS(myArray))
...