C 라이브러리 용 하스켈 래퍼를 만들려고합니다. 기본 구조체는 명시 적 형식으로 표현하기에는 너무 복잡하며 C 함수 간 전달 이외의 다른 용도로 사용하지 않으므로 GHC에서 나를 대신 사용하도록 EmptyDataDecls
을 사용하고 있습니다.저장 가능한 빈 데이터 선언
이 데이터 유형 중 하나에 대한 포인터가 필요하지만 alloca
으로 데이터를 만들려고하면 데이터 유형이 Storable
이 아니란 점에 대해 불만을 토로합니다. 예 :
{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
module Main where
import Foreign.Marshal.Alloc
import Foreign.Ptr
data Struct
foreign import ccall "header.h get_struct"
get_struct :: Ptr Struct -> IO()
main = alloca $ \ptr -> get_struct ptr
GHC는 Storable Struct
의 인스턴스가 없다고 말하면서 컴파일하지 않습니다. 내가 직접 구현할 수 :
instance Storable Struct where
sizeOf _ = ...
alignment _ = ...
을하지만 그 목적을 격파에 근접 - 내가 구조체에의하든 상관하지 않는 경우와 같은 일을 정의하고 싶지 않아요.
Ptr
클래스가 Storable
이기 때문에 포인터에 대한 포인터가 정상적으로 작동하는 것으로 나타났습니다. 그래서 나는 get_struct
를 호출하기 전에 ptr
에 peek
를 사용하여 목표로하고있는 무슨을 수행 할 수 있습니다 이것은 해킹 같은 느낌
main = alloca $ \ptr -> do
ptr <- peek ptr
get_struct ptr
을하지만.
인스턴스를 정의하지 않고 빈 데이터 선언을 Storable
으로 간주 할 수있는 방법이 있습니까?
이것은 해킹입니다. 내부 포인터를위한 공간을 할당하지 않는다; 방금 임의의 메모리를 가리키고 있습니다. 이 방법은 segfaults 거짓말. –
그래서 합법적으로 포인터에 대한 포인터를 원한다면, 나는 두 개의'alloca' 호출을 사용하고 다른 하나는'poke' 포인터를 사용해야합니다, 맞습니까? – zmthy
예 (다른 형태의 할당을 사용하십시오). 포인터에 대한 포인터의 가장 일반적인 용도는 포인터 아웃 값입니다.이 경우 바인드 된 함수가 할당을 만들고 문자열 배열을 사용합니다 ('argv'라고 생각하십시오). Th –