从R调用C函数

时间:2014-04-15 20:31:13

标签: c r

我想在R函数中包含对这些C函数中的任何一个的调用:

char *sendpraat (void *display, const char *programName, long timeOut, const char *text);
wchar_t *sendpraatW (void *display, const wchar_t *programName, long timeOut, const wchar_t *text);

我可以很好地构建源代码:

$ R CMD SHLIB -o pRaat.so sendpraat.c 
clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG  -I/usr/local/include    -    fPIC  -mtune=core2 -g -O2  -c sendpraat.c -o sendpraat.o
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -    multiply_defined suppress -L/usr/local/lib -L/usr/local/lib -o pRaat.so sendpraat.o -    F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation

但是当我调用加载的函数时,我导致R崩溃:

dyn.load("pRaat.so")
.Call("sendpraat",
as.integer(1),
as.character("Praat"),
as.integer(0),
as.character("Create Sound as pure tone... tone 1 0 0.4 44100 440 0.2 0.01 0.01"),
PACKAGE="pRaat")

*** caught segfault ***
address 0x0, cause 'unknown'

我是sypply导致这种情况的(void *)吗?我的平台(OSX)上的底层函数没有使用它。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

.Call()接口接收并返回SEXP个对象,因此您的接口错误。 您可以尝试使用较旧的.C(),但不鼓励新项目。请注意,您还需要转换您的函数 - 也许是时候重新审视Writing R Extensions中的一些示例了?