Как правильно передать адрес массива в 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))
...
Другие вопросы по тегам