我有来自R的C代码:
.C("giveProb",as.double(2),as.double(2),as.double(c(0,1,0,1,1,0,1,0)))
Run Code Online (Sandbox Code Playgroud)
我想把它称为一堆(数十万或数百万)次(具有不同的第三个参数),并且当我将它放入for循环中大约100次时它工作正常,但是上面的任何东西都会崩溃R.
我觉得使用R_alloc是一个内存问题.我在C中分配了六个数组,例如:
newCoefArray = (double *)R_alloc(1,curSize * sizeof(double));
Run Code Online (Sandbox Code Playgroud)
但根据R手册"编写R扩展":
此内存从堆中获取,并在.C,.Call或.External调用结束时释放.
我认为这意味着在循环的每次迭代期间将释放内存.但在下一句话中:
用户还可以通过调用vmaxget来记录当前位置并通过调用vmaxset清除随后分配的内存来管理它.这仅建议专家使用.
作为一个离专家不远的人,我希望有人可以提供帮助.C代码完整如下.
#include <R.h>
#include <Rmath.h>
#include <stdio.h>
void giveProb(double *k, double *q,double *order){
double curSize;
double tmpSize;
double *newCoefArray;
double *oldCoefArray;
double *newAArray;
double *oldAArray;
double *newBArray;
double *oldBArray;
int position=0;
long int factorial(int n){
if(n==0||n==1){
return(1);
}
int tmp=1,i=1;
while(i<=n){
tmp=tmp*i;
i++;
}
return(tmp);
}
void expander(double a, double b,double c,double d,double coeff){
double leadingTerm=beta(a,b);
int bb=b;
double index[bb], sumLeaders[bb];
for(int i=0;i<bb;i++){
index[i]=a+i;
sumLeaders[i]=factorial(a+b-1)/(factorial(index[i])*factorial(a+b-1-index[i]));
newCoefArray[i+position]=coeff*leadingTerm*sumLeaders[i]; …Run Code Online (Sandbox Code Playgroud)