4

設定

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
4

1 に答える 1