【发布时间】:2019-11-06 18:16:44
【问题描述】:
我正在尝试从 julia 调用一些 fortran (f90) 代码,但我似乎无法让 fortran 理解从 julia 传递的动态分配的数组。这个fortran代码:
MODULE myModule
implicit none
public Func
CONTAINS
subroutine Func(A,B)
integer*8, intent(inout) :: A(3)
integer*8, intent(inout) :: B(:)
integer :: i
write(*,*) "size of A"
write(*,*) size(A)
write(*,*) "A"
do i=1,3
write(*,*) A(i)
enddo
write(*,*) "size of B"
write(*,*) size(B)
write(*,*) "B"
do i=1,size(B)
write(*,*) B(i)
enddo
end subroutine Func
end module
由这个 julia 代码调用
A = [1,2,3]
B = [4,5,6]
ccall((:__mymodule_MOD_func,"./test.so"), Nothing ,(Ref{Int64},Ref{Int64}), A,B)
产生这个结果
size of A
3
A
1
2
3
size of B
0
B
我希望 size(B) 为 3。
有什么方法可以在不更改 fortran 代码的情况下完成这项工作?我知道我可以重写 fortran 代码以在函数调用中包含数组的维度,但我希望能够调用已经以与我提供的示例类似的方式编写的 fortran 代码。
【问题讨论】:
-
你不能用来自 Julia 的普通 ccall 神奇地做到这一点。对于假定的形状数组,应该以某种方式传递此类信息。 This might be a good read。您也许可以创建一些中间层,但是您需要以一种或另一种方式从 Julia 端传递该信息。
-
@mlt,gfortran 的数组描述符已更改。您发布的网址适用于 9.1 之前的版本。
-
@Steve 谢谢!我已经有一段时间没有使用 Fortran 了。我的观点是这样做会很混乱且不便携。我想你证实了我的观点。
-
@mlt,最近的描述符更改实际上是出于可移植性的动机。技术规范 ISO/IEC TS 29113:2012 定义了涂料矢量。