10

私がやりたいことは、Haskell から C に平文の文字列を渡すことだけです。ただし、[Char] は受け入れられない戻り値の型であると書かれています。彼らがそう考える理由も、許容できる戻り値の型もどこにも見つかりません。

Qemu で起動できる非常にシンプルな OS イメージを作成しようとしています。

誰もこれを行う方法を知っていますか? ありがとう。

    {-# LANGUAGE ForeignFunctionInterface #-}

    module Hello where

    import Foreign
    import Foreign.C.String
    import Foreign.C.Types

    hello :: String -> (CString -> IO a) -> IO a
    hello = "Hello, world!"

    foreign export ccall hello :: String -> (CString -> IO a) -> IO a
4

2 に答える 2

15

あなたが欲しいCString

からCStringString:

peekCString :: CString -> IO String

からStringCString:

withCString :: String -> (CString -> IO a) -> IO a

moduleForeign.C.Stringの Haddock ドキュメントもあります。

foreign宣言で使用できる型の一般的なリストは、Haskell Report の外部関数インターフェイスの一部として指定されています。

編集

わかりました、これはあなたができることの非常に小さな例です、あなたのサンプルコードにいくらか基づいています. CTest.hs次の内容の Haskell ファイルを作成します。

module CTest where

import Foreign.C

hello :: IO CString
hello = newCString "hello"

foreign export ccall hello :: IO CString

ctest.c次に、次の内容でC ファイルを作成します。

#include <stdio.h>
#include "CTest_stub.h"

int main (int argc, char *argv[]) {
  hs_init(&argc, &argv);
  printf("%s\n", hello());
  hs_exit();
  return 0;
}

次に、次のようにコンパイルして実行します。

$ ghc CTest
[1 of 1] Compiling CTest            ( CTest.hs, CTest.o )
$ ghc -o ctest ctest.c CTest.o -no-hs-main
$ ./ctest
hello
于 2013-07-23T13:57:57.473 に答える