Прототип:

myFunction( ULONG , *ULONG ),PASCAL

Переменные:

myArray ULONG, DIM(30)
myStuff ULONG

< EM> Код:

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

< EM> < STRONG> Ошибка :

Нет подходящего прототипа - C: ...

Что-то не так с самим прототипом или я неправильно передаю переменную?

Для уточнения фактической функции, о которой идет речь, является glSelectBuffer (GLsizei, * GLuint), PASCAL.

Где GLSizei приравнивается к ULONG, а GLuint приравнивается к ULONG.

Возможно ли, что равные вызывают сбой в системе? Я бы так не подумал, потому что до сих пор не было других проблем с адаптацией других функций для совместимости с Clarion, но эта, в частности, была чрезвычайно проблемной. Функция ищет массив определенного пользователем размера для использования в качестве буфера для хранения данных выбора. Я думал, что будет достаточно просто создать буфер (см .: myArray ULONG, DIM (30)), а затем просто передать переменную, поскольку она должна передавать адрес массива, но пока это привело только к ошибке компиляции, указанной выше .

Любая помощь будет принята с благодарностью.

4
Proxus 31 Мар 2011 в 01:09
Это Clarion?
 – 
genpfault
31 Мар 2011 в 02:18

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 это просто неизбежно ...

2
Proxus 3 Май 2011 в 21:38

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

  PROGRAM


myArray ULONG, DIM(30)
myStuff ULONG

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

  END

  CODE
    myFunction(myStuff,myArray)

myFunction  Procedure(a,b)
  code
3
Bruce 2 Апр 2011 в 18:41

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

Прототип:

myFunction( ULONG , LONG ),PASCAL

< EM> Код:

...
myFunction(myStuff, ADDRESS(myArray))
...
1
Carlos Gutiérrez 1 Апр 2011 в 05:22
Я пробовал это однажды, но, к сожалению, при использовании этого метода вызов OpenGL вылетал из строя, даже если я смог успешно скомпилировать. Однако я нашел решение, и вскоре я опубликую его здесь.
 – 
Proxus
1 Апр 2011 в 18:58