我正在使用 GNU GSL 库开发 R 包。 GSL库从http://www.stats.ox.ac.uk/pub/Rtools/libs.html下载.针对 x64 和 i386 的编译通过了 R CMD 检查。源码包也可以安装在 32 位和 64 位 Windows 上。在 64 位 Windows 上一切正常。
但是,程序包在 32 位 Windows 上崩溃并抛出以下错误消息 “gsl::\blas\blas.c:107 错误长度调用默认 GSL 错误处理程序”
我检查了原始源代码
gsl_vector_view ci = gsl_matrix_row (A, i);
gsl_vector_view ck = gsl_matrix_row (A, k);
Rprintf("cisize=%d\n,cksize=%d\n",ci.vector.size,ck.vector.size);
gsl_vector_view di = gsl_vector_subvector(&ci.vector, 0, i);
gsl_vector_view dk = gsl_vector_subvector(&ck.vector, 0, i);
Rprintf("disize=%d\n,dksize=%d\n",di.vector.size,dk.vector.size);
gsl_blas_ddot (&di.vector, &dk.vector, &sum);
错误是由于di.vector.size和dk.vector.size最后一行代码gsl_blas_ddot引起的。
在 windows 64 上,输出打印为:
cisize=5
cksize=5
disize=1
dksize=1
而在 windows 32 上,输出打印不固定,一个输出是:
cisize=337939976
cksize=1
disize=0
dksize=326253992
另一个输出是
cisize=251898432
cksize=1
disize=0
dksize=151229056
谁能告诉我问题出在哪里?
谢谢!
最佳答案
我发现错误是由“gsl_matrix_row”函数引起的,我重写了代码来自己实现该函数:
gsl_vector *di=gsl_vector_alloc(i);
gsl_vector *dk=gsl_vector_alloc(i);
for(l = 0; l < i; l++)
{
gsl_vector_set(di,l,gsl_vector_get(ci,l));
gsl_vector_set(dk,l,gsl_vector_get(ck,l));
}
gsl_vector_free(di);
gsl_vector_free(dk);
但是,我仍然不知道为什么“gsl_matrix_row”在 32 位 Windows 机器下不能工作。
关于c++ - 32 位和 64 位 Windows 上 GSL 库的差异导致 R 包错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126060/