Tag: ffi

尝试与Haskell的C ++绑定:获取未定义的引用错误

我在Haskell中尝试C ++绑定,并在调用绑定时遇到“未定义的引用”错误。 我做了一个小项目( http://github.com/deech/CPlusPlusBindings )来说明问题。 它包括一个小的C ++类,一个C包装器,一个C测试脚本和一个Haskell绑定和一个测试脚本。 C测试脚本有效,Haskell给我一个: [1 of 1] Compiling Binding ( dist/build/Binding.hs, dist/build/Binding.o ) src/Binding.chs:6:26: Warning: Defined but not used: `res’ In-place registering CPlusPlusBinding-0.1.0.0… Preprocessing executable ‘binding_test’ for CPlusPlusBinding-0.1.0.0… [1 of 1] Compiling Main ( src/BindingTest.hs, dist/build/binding_ /binding_test-tmp/Main.o ) src/BindingTest.hs:3:1: Warning: Top-level binding with no type signature: main :: IO () Linking […]

是否可以从OCaml调用C函数,而不包含类型?

我正试图在OCaml中编写一个(极其微小,简单 – 我不知道我在做什么,让我们真实!)编译器。 我真的想避免在项目中检查任何 ISO-C代码(尽管很好地了解C;这里的目标是专门学习和使用OCaml。)根据这一点,我需要为编译编写一个“运行时” OCaml中的语言,与主项目分开编译,然后将其与编译器本身的输出相关联。 不幸的是,它看起来像任何外部函数 – 甚至那些不接触任何OCaml数据结构/ OCaml堆的函数 – 都应该使用OCaml的C宏构建: CAMLprim value scheme_entry(value unit) { int i; i = 42; return Val_int(i); } 如果我自己发出assembly说明,这可能不是一个选择。 (至少,直到我学到更多东西!) 是否有任何方法(包括hacky – 这是一个个人学习项目)来调用OCaml中的以下非常简单的函数? _scheme_entry: movl $42 %eax ret 作为参考,我正在通过Ghuloum的IACC: http ://ell.io/tt$ocameel

常见的lisp,CFFI和实例化c结构

我一直在谷歌上,约3小时寻找解决这个“问题”的解决方案。 我试图弄清楚如何使用CFFI在lisp中实例化C结构。 我在c中有一个结构: struct cpVect{cpFloat x,y;} 简单吧? 我有自动生成的CFFI绑定(swig,我认为)到这个结构: (cffi:defcstruct #.(chipmunk-lispify “cpVect” ‘classname) (#.(chipmunk-lispify “x” ‘slotname) :double) (#.(chipmunk-lispify “y” ‘slotname) :double)) 这会生成一个带有插槽的结构“VECT”:X和:Y,外部插槽名称确认(请注意我既没有生成绑定也没有编写C库(chipmunk physics),但实际的函数是从lisp调用的正好)。 我已经搜索了很多,也许我已经看过它100次并且掩盖了它,但我无法弄清楚如何在lisp中创建一个cpVect实例以用于其他function。 注意function: cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset) 不仅需要一个cpVect,还需要一个指向一组cpVects的指针,这让我想到了第二个问题:如何创建指向一组结构的指针? 我去过http://common-lisp.net/project/cffi/manual/html_node/defcstruct.html并尝试了代码,但得到“错误:未绑定变量:PTR”(我在Clozure CL中),更不用说看起来只返回一个指针,而不是一个实例。 我是lisp的新手,到目前为止一直非常强大,但这是我遇到的第一个真正的问题,我无法弄明白。 谢谢!

LuaJit FFI从C函数返回字符串到Lua?

说我有这个C函数: __declspec(dllexport) const char* GetStr() { static char buff[32] // Fill the buffer with some string here return buff; } 而这个简单的Lua模块: local mymodule = {} local ffi = require(“ffi”) ffi.cdef[[ const char* GetStr(); ]] function mymodule.get_str() return ffi.C.GetStr() end return mymodule 如何从C函数中获取返回的字符串作为Lua字符串: local mymodule = require “mymodule” print(mymodule.get_str())

如何在没有c2hs或其他工具的情况下为此结构创建可存储的实例?

这个结构: typedef struct Atom_ { float x; float y; float z; int col; } Atom; 对应于这种类型: data Atom = Atom { pos :: V3 Float, col :: Int } 如何为Atom创建一个可存储的实例,以便我可以将Haskell上的Atom发送到需要Atom的C函数?

将任意大小的整数从Prolog传递到C.

现在,我正在学习如何使用C代码连接SICStus Prolog。 我想在SICStus Prolog版本4中使用/使用/查看任意大小的整数的“汉明重量”的C实现。 在我看来,我需要C函数来测试术语类型(SP_is_integer)和C函数来访问Prolog术语(SP_get_integer,SP_get_integer_bytes)。 但是,我不确定如何以便携,健壮的方式使用SP_get_integer_bytes。 你能指点一些精心设计的C代码做到这一点吗?

创建链接到Rust dylib的共享C对象以在R中使用

我正在尝试创建一个可以加载到R中的共享对象,它通过R的C API调用Rust函数。 要从C调用Rust,我正在关注此博文 。 当我尝试创建共享库并链接到Rust库时,我的问题出现了。 链接器抱怨它无法找到我的Rust函数。 我对编译语言很陌生,在转向SO之前已经花了几天的努力。 在那段时间里,我学到了很多关于编译器标志的知识,但却没有更接近解决方案。 我认为这可能是显而易见的事情。 我的C ++代码: #include “Rinternals.h” #include “Rh” #include “treble.h” // test.cpp extern “C” { SEXP triple(SEXP val) { int32_t ival = *INTEGER(val); Rprintf(“9 tripled is %d\n”, treble(ival)); return R_NilValue; } } treble.h: #include int32_t treble(int32_t value); 我的Rust代码: #![crate_type = “dylib”] #[no_mangle] pub extern fn treble(value: i32) -> […]

如何检查从C传递的函数指针是否为非NULL

示例代码如下 Rust部分: #[no_mangle] pub extern fn call_c_function(value: i32, fun: fn(i32) -> i32) -> i32 { fun(value) } 而C部分: int32_t call_c_function(int32_t value, int32_t (*fun)(int32_t)); int32_t triple(int32_t x) { return x*3; } int main(int argc, char *argv[]) { int32_t value = 3; int32_t result = call_c_function(value, triple); printf(“%d tripled is %d\n”, value, result); call_c_function(0, NULL); // Crash […]

是否可以在Haskell中创建PHP扩展?

是否可以使用Haskell创建PHP扩展? 通常PHP扩展是使用C编写的。使用Haskell FFI来提供存根C扩展的function(甚至是个好主意)? 这种方法有什么警告? Zend是否会在后台执行一些会破坏这种方案的魔法?

hsc2hs:使用Haskell改变C结构

我正在尝试编写一个与C通信的Haskell程序(最终通过GHC-iOS为iOS)。 我希望它将一个字符串从C传递给Haskell,让Haskell处理它,然后通过hsc2s将一些数据类型从Haskell返回到C Structs。 我找不到一个清晰,简单的教程是不成功的。 Haskell唯一需要的是String,没有别的。 我对第一部分没有任何问题,将字符串传递给Haskell。 testPrint :: CString -> IO () testPrint c = do s <- peekCString c putStrLn s 出于测试目的和将来的参考,我只想能够处理如下的内容。 C结构 struct testdata { char *a; char *b; int c; }; Haskell数据类型 data TestData = TestData { a :: String, b :: String, c :: Int } deriving Show — not sure […]