Как вызвать функцию типа Ptr GLubyte -> IO () в Haskell - PullRequest
4 голосов
/ 08 июля 2011

В библиотеке OpenGL Raw есть следующая функция:

glPolygonStipple :: Ptr GLubyte -> IO ()

Аналог C этой функции принимает указатель на массив, но как я могу вызвать эту функцию с массивом / списком в программе на Haskell?

Ответы [ 2 ]

5 голосов
/ 08 июля 2011

Вы будете использовать mallocArray для выделения памяти и pokeArray, чтобы поместить в него свой список:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Foreign-Marshal-Array.html#v:mallocArray

Что-то вроде:

do
  arrayOfGLuBytes <- (mallocArray 15) :: IO (Ptr GLubyte)
  pokeArray arrayOfGLuBytes [1,2,3,4]
  glPolygonStipple arrayOfGLuBytes
  free arrayOfGLuBytes -- free from Foreign.Marshall.Alloc
0 голосов
/ 08 июля 2011

Вероятно, лучший путь в этой ситуации - это хранимые векторы в векторном пакете [http://hackage.haskell.org/packages/archive/vector/0.7.1/doc/html/Data-Vector-Storable.html][1]. Пакет предоставляет богатый интерфейс как для неизменяемых, так и для изменяемых векторов, поэтому не нужно создавать векторы внутри монады ввода-вывода.Кроме того, списки связаны списком и преобразованием в массивы inovlve копирование

Ваш конкретный пример может выглядеть как

let myVector = fromList [1,2,3,4] 
in unsafeWith myVector glPolygonStipple
...