Как правильно передать адрес массива в Clarion? - PullRequest
4 голосов
/ 31 марта 2011

Прототип:

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 ]

3 голосов
/ 02 апреля 2011

Правильный подход - просто поместить [] в прототип.Например, следующая программа компилируется нормально.

  PROGRAM


myArray ULONG, DIM(30)
myStuff ULONG

  MAP  
   myFunction( ULONG , *ULONG[] ),PASCAL

  END

  CODE
    myFunction(myStuff,myArray)

myFunction  Procedure(a,b)
  code
2 голосов
/ 01 апреля 2011

Приравнивается:

GLsizei             EQUATE(ULONG)
GLuint              EQUATE(ULONG)

Прототип:

glSelectBuffer( GLsizei , *GLuint ),PASCAL

Данные:

mySelectionBuffer &STRING
myBufferPointer   &ULONG
curSelection      ULONG

Init:

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]
...  

Shutdown:

DISPOSE(mySelectionBuffer)  

Некоторые, вероятно, будут утверждать, что это был не лучший способ решения проблемы, однако, в конце концов, это было единственное решение, с которым я столкнулся, которое не только компилировалось, но и впоследствии не приводило к сбоям на стороне OpenGL после прохождения. данные обратно к нему. Я бы предпочел предпочитать , чтобы не играть с памятью для выполнения моей задачи, но кажется, что при работе с функциями в других API это просто неизбежно ...

1 голос
/ 01 апреля 2011

Когда все не удается, вы можете создать прототип параметра как LONG и передать в него ADDRESS переменной, например:

Прототип:

myFunction( ULONG , LONG ),PASCAL

Код:

...
myFunction(myStuff, ADDRESS(myArray))
...
...