gpt4 book ai didi

r - 函数 .C -- 参数设置编译失败

转载 作者:行者123 更新时间:2023-12-04 09:45:54 25 4
gpt4 key购买 nike

我目前正在学习在 R 中调用编译的 C 代码。昨天我为无限 pi 系列创建了一个函数,当在 R 中运行时,它返回一个长度为 1 的数字向量 (pi),效果很好。今天我正在研究一个输出可变长度数值向量的函数,即为用户定义的 n 计算的斐波那契数列。 .

在编写 R 扩展中,注意到“编译后的代码不应返回任何内容,除非通过它的参数”。这是我遇到麻烦的地方。我不知道如何设置下面的C代码,即最终 中的参数else 声明 ,以便在调用 system 后不会触发错误.

我在 C 程序中编译了一个稍微不同的版本,它可以工作。但是,编译要在 R 中调用的代码的设置是不同的。我必须对其进行调整以适应 R 函数的规范 .C .

如何更改以下函数,以便在编译时没有警告或错误,并且可以在 R 函数中调用 .C ?

需要编译的C代码:

void fibonacci(int *n, int *ans)
{
# *ans = 0; I tried this, didn't work

if(*n == 1 || *n == 2){
*ans = 1;
} else if(*n == 0){
*ans = 0;
} else {
*ans = fibonacci(n - 2) + fibonacci(n - 1); # tried 'ans' in arguments
} # here, didn't work
}

此处发生错误:
## compile and create shared library
> system('gcc -Wall -g -c -fPIC fibonacciR.c -o fibonacciR.o')
fibonacciR.c: In function ‘fibonacci’:
fibonacciR.c:8:5: error: too few arguments to function ‘fibonacci’
fibonacciR.c:1:6: note: declared here
fibonacciR.c:8:5: error: too few arguments to function ‘fibonacci’
fibonacciR.c:1:6: note: declared here

更改最终 ans C 代码中的行
} else {
*ans = fibonacci(n - 2, ans) + fibonacci(n - 1, ans);
}

产生不同的错误
> system('gcc -Wall -g -c -fPIC fibonacciR.c -o fibonacciR.o')
fibonacciR.c: In function ‘fibonacci’:
fibonacciR.c:10:5: error: void value not ignored as it ought to be
fibonacciR.c:10:5: error: void value not ignored as it ought to be

我绝对不是专业的 C 程序员,我不知道如何忽略争论。此外,这个函数的设置方式,当我在 R 中调用它时,它只会返回一个值。所以我想我需要循环 .C对于用户定义的参数 n .那是对的吗?

一旦我解决了错误,就打电话跟进。
system('gcc -Wall -g fibonacciR.o -shared -o libfibonacciR.so')
## load compiled program into R
dyn.load('libfibonacciR.so')
## create function to call compiled program
fibonacci <- function(n)
{
.C('fibonacci', as.integer(n), ans = as.integer(ans))$ans
}
## call function - result should be first 10 fibonacci numbers
fibonacci(n = 10)
## expected result
[1] 1 1 2 3 5 8 13 21 34 55

最佳答案

您已经知道以下行中的错误。

*ans = fibonacci(n - 2) + fibonacci(n - 1); # tried 'ans' in args here,

我认为,您应该编写一个辅助函数来完成所有工作,简化流程。
int fibonacci_helper(n)
{
if(n == 1 || n == 2){
return 1;
} else if(n == 0){
return 0;
} else {
return fibonacci_helper(n-1) + fibonacci_helper(n-2);
}
}

void fibonacci(int *n, int *ans)
{
*ans = fibonacci_helper(*n);
}

关于r - 函数 .C -- 参数设置编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23453373/

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