3

cFromEnum関数を使用したいのですがC2HS、これはモジュールにあり、不要であり、アンパック/インストールしないでください( c2hs が正しくインストール/登録されていません)。列挙型を変換する最新の方法は何ですか? 具体的には、これが私のコードです。

{# enum BNType {underscoreToCase} deriving (Show, Eq) #}
{# pointer *NodeVector newtype #}
{# fun get_nodes_by_type { cFromEnum `BNType' } -> `NodeVector' id #}

get_nodes_by_type最終的には引数を取ります。私は今のところ何かを機能させようとしています)。

4

1 に答える 1

1

AFAICT、この時点でc2hsユーザーは独自のマーシャリング関数を作成する必要があります。fromIntegral . fromEnum残念ながら、マーシャラーは任意の式ではなく名前である必要があるため、c2hs宣言内でマーシャラーとして使用することはできません。

現在、私はマーシャラーを自分で作成し、.c2hsファイルに含めています。これが私のより複雑なバインディングの1つからのマーシャラーです。特にかじりの状況を見つけましたwithObject が、それほど多くはないので、まだ自分で修正しようとしました。

cIntToEnum :: Enum a => CInt -> a
cIntToEnum = toEnum . fromIntegral

cIntFromEnum :: Enum a => a -> CInt
cIntFromEnum = fromIntegral . fromEnum

cIntConv :: (Integral a, Num b) => a -> b
cIntConv = fromIntegral

cFloatConv :: (Real a, Fractional b) => a -> b
cFloatConv = realToFrac

-- |since c2hs doesn't allow "with" as an input marshaller,
-- withObject is a synonym.
withObject :: Storable a => a -> (Ptr a -> IO b) -> IO b
withObject = with

withFloatArray :: (Storable b, RealFloat b, RealFloat a) =>
  [a]
  -> (Ptr b -> IO b1)
  -> IO b1
withFloatArray = withArray . map (cFloatConv)

間違いなく、これらの多くは抽出され、共通のライブラリに入れられるべきです。それがc2hsパッケージにバンドルされていれば、それは完璧でしょう(IMHO C2HSモジュールは少し時期尚早に削除されました)。

于 2012-02-28T16:40:21.867 に答える