設定
c2hs によって Haskell にレンダリングされた AC 列挙型で、Storable正しくコンパイルされるインスタンスを備えています ( TypesC2Hs.chs)。inline-cこれを非修飾で、コンテキスト ( )に割り当てたモジュールにインポートしますInternal.hs。.hsc2hs によって生成されたモジュールと、C 呼び出しをラップする準引用符を保持するもう 1 つのモジュールInternal.hsによってインポートされたモジュールの両方。InlineC.hsinline-c
TypesC2Hs.hs -------------
| |
V V
Internal.hs -------> InlineC.hs
質問
InlineC.hsこの型をマーシャリングできないと不平を言います:
何が起こっている?inline-cこのタイプのエラーが表示されるのはこれが初めてです。
直接逆参照する必要のない他のタイプ、たとえばnewtype DM = DM (Ptr DM) deriving Storable、上記のアプローチで問題なく動作することに注意してください。
前もって感謝します
タイプC2Hs.chs
{# enum DMBoundaryType as DMBoundaryType {underscoreToCase} deriving (Eq, Show) #}
instance Storable DMBoundaryType where
sizeOf _ = {# sizeof DMBoundaryType #}
alignment _ = {# alignof DMBoundaryType #}
peek = peek
poke = poke
内部.hs
{-# LANGUAGE QuasiQuotes, TemplateHaskell ,GeneralizedNewtypeDeriving, StandaloneDeriving ,DeriveDataTypeable, DataKinds, OverloadedStrings #-}
module Internal where
import TypesC2Hs
import qualified Language.C.Inline as C
import qualified Language.C.Types as CT
import Language.C.Inline.Context
import qualified Language.Haskell.TH as TH
import Data.Monoid ((<>), mempty)
import qualified Data.Map as Map
ctx :: Context
ctx = baseCtx <> funCtx <> vecCtx <> bsCtx <> pctx where
pctx = mempty {ctxTypesTable = typesTable}
typesTable :: Map.Map CT.TypeSpecifier TH.TypeQ
typesTable = Map.fromList
[ (CT.TypeName "DMBoundaryType", [t| DMBoundaryType |]) ]
InlineC.hs
dmdaCreate1d0' cc bx m dof s =
withPtr ( \ dm -> [C.exp|int{DMDACreate1d($(int c),
$(DMBoundaryType bx),
$(PetscInt m),
$(PetscInt dof),
$(PetscInt s),
NULL,
$(DM* dm))}|] )
where c = unComm cc