我正在尝试使用Visual STudio 2013中的LF Fortran编译器编译LAPACK Fortran文件来创建.NET DLL。
我已经成功编译了BLAS包,它是LAPACK的依赖。
但是在编译LAPACK文件时,我得到了"无效操作"声明:
CALL CLA_GBRFSX_EXTENDED( PREC_TYPE, TRANS_TYPE, N, KL, KU,
$ NRHS, AB, LDAB, AFB, LDAFB, IPIV, COLEQU, C, B,
$ LDB, X, LDX, BERR, N_NORMS, ERR_BNDS_NORM,
$ ERR_BNDS_COMP, WORK, RWORK, WORK(N+1),
$ TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N),
$ RCOND, ITHRESH, RTHRESH, UNSTABLE_THRESH, IGNORE_CWISE,
$ INFO )
我已经检查了子程序CLA_GBRFSX_EXTENDED中的参数类型。它们都相同,但除了返回值" TRANSFER(RWORK(1:2 * N),(/(ZERO,ZERO)/),N)"言。
我已将变量定义为
COMPLEX Y_TAIL_ATE(1:2*N)
并填写为
Y_TAIL_ATE = TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N)
将子程序称为
CALL CLA_GBRFSX_EXTENDED( PREC_TYPE, TRANS_TYPE, N, KL, KU,
$ NRHS, AB, LDAB, AFB, LDAFB, IPIV, COLEQU, C, B,
$ LDB, X, LDX, BERR, N_NORMS, ERR_BNDS_NORM,
$ ERR_BNDS_COMP, WORK, RWORK, WORK(N+1),
$ Y_TAIL_ATE,
$ RCOND, ITHRESH, RTHRESH, UNSTABLE_THRESH, IGNORE_CWISE,
$ INFO )
现在,编译器为
提供了相同的错误Y_TAIL_ATE = TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N)
我明白这个问题是
TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N)
因为,我的知识是关于c#,我无法弄清楚解决方案。但我的c#代码必须使用LAPACK,我必须解决这个问题。
有任何解决方案吗?
提前致谢...
答案 0 :(得分:0)
其中一个问题是表达式
TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N)
返回带有N
元素的排名1的复数数组 - 这是参数N
指定的内容。然后,分配
Y_TAIL_ATE = TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N)
尝试将N
元素数组分配给2*N
元素数组,Fortran不会这样做。 RWORK
具有2*N
(真实)元素的事实与TRANSFER
的结果大小无关,因为它在此处提供了大小(N
)。
Fortran会为数组分配一个标量,并将对两个相同形状的数组进行单语句分配。但它不会让你在左侧和右侧编写具有不同形状阵列的作业
我对CLA_GBRFSX_EXTENDED
一无所知,我只是假设编译器也在代码的第一个版本中发现了虚拟和实际参数的不匹配。