gpt4 book ai didi

c - 如何构造一个命名列表(一个 SEXP)以从使用 .Call() 调用的 C 函数中返回?

转载 作者:太空狗 更新时间:2023-10-29 14:51:48 25 4
gpt4 key购买 nike

我通过 .Call("foo", <args>) 调用 C 代码,其中 foo 调用其他 C函数,计算结果并返回它。结果是一个列表长度为 3,我想命名这个列表。为此,佛这样做:

/* Construct result list from variables containing the results */
SEXP res = PROTECT(allocVector(VECSXP, 3)); /* list of length 3 */
SET_VECTOR_ELT(res, 0, ScalarReal(a)); /* numeric(1) */
SET_VECTOR_ELT(res, 1, somenumericvector); /* numeric(<some length>) */
SET_VECTOR_ELT(res, 2, ScalarInteger(i)); /* integer(1) */

/* Name components and return */
SEXP nms = PROTECT(allocVector(STRSXP, 3)); /* names as SEXP */
char *nms_ = CHAR(STRING_ELT(nms, 0)); /* pointer to names */
char *names[3] = {"result_numeric", "result_numeric_vector", "result_integer"};
for(i = 0; i < 3; i++) nms_[i] = names[i];
setAttrib(res, R_NamesSymbol, nms);
UNPROTECT(1);
return res;

这是构建长度为 3 的命名列表的正确方法吗?

C 函数确实返回到 R,但是一旦我将输出分配给R 中的变量,我立即得到一个段错误。可能出了什么问题?我可以在上面的“返回”之前放置“调试语句”(简单printf("...\n")资源;'他们执行得很好。有没有方便的方法来调试从 R 调用的 C 代码?

最佳答案

BrodieG 的答案的替代方法是使用 Rinlinedfuns.h 中的 mkNamed(其中包含如何使用 mkNamed 的示例)。

/* Construct named result list from variables containing the results */
const char *names[] = {"result_numeric", "result_numeric_vector",
"result_integer", ""}; /* note the null string */
SEXP res = PROTECT(mkNamed(VECSXP, names)); /* list of length 3 */
SET_VECTOR_ELT(res, 0, ScalarReal(a)); /* numeric(1) */
SET_VECTOR_ELT(res, 1, somenumericvector); /* numeric(<some length>) */
SET_VECTOR_ELT(res, 2, ScalarInteger(i)); /* integer(1) */
UNPROTECT(1);
return res;

关于c - 如何构造一个命名列表(一个 SEXP)以从使用 .Call() 调用的 C 函数中返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com