c++ - 32 位和 64 位 Windows 上 GSL 库的差异导致 R 包错误?

标签 c++ r windows

我正在使用 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/

相关文章:

c++ - 使用非平凡构造函数初始化对象的 std::array

java - 如何在java中使用R模型来预测多个模型?

java - 对于正确名称的正确 DLL 中的 Windows API 函数,JNA 抛出 java.lang.UnsatisfiedLinkError

windows - 批处理文件可以更改系统日期吗?保存带有属性的文件;将日期改回当前日期?

c++ - 将布局从一个类添加到另一个类在 Qt 中不起作用

c++ - 简单阶乘查找器功能

r - 快速读取非常大的表作为数据框

r - 计算元素在序列中重复的次数(在 R 中)

java - 防止 jfx packager 的辅助启动器在 Windows 中触发 UAC/提升权限

c++ - 使用 repaint() 刷新停止工作