C# 在C语言中,用模块变量同时调用fortran dll中的方法#
我试图在不同的线程中同时调用Fortran方法。执行完全独立于彼此和主线程。问题是,使用模块变量意味着dll将变量设置为全局变量,这意味着两个调用将使用它,从而导致程序崩溃,因此发生了这种情况。这是我的解释,基于此 C# FORTRANC# 在C语言中,用模块变量同时调用fortran dll中的方法#,c#,fortran,pinvoke,gfortran,C#,Fortran,Pinvoke,Gfortran,我试图在不同的线程中同时调用Fortran方法。执行完全独立于彼此和主线程。问题是,使用模块变量意味着dll将变量设置为全局变量,这意味着两个调用将使用它,从而导致程序崩溃,因此发生了这种情况。这是我的解释,基于此 C# FORTRAN !DEC$ ATTRIBUTES DLLEXPORT::ingammaextern subroutine sub(size, myarray) use module1 ! * REMOVING MODULE USAGE FIXES THE PROB
!DEC$ ATTRIBUTES DLLEXPORT::ingammaextern
subroutine sub(size, myarray)
use module1 ! * REMOVING MODULE USAGE FIXES THE PROBLEM
implicit none
INTEGER :: size
integer :: assignme
REAL, dimension(1:size) :: myarray
assignme = size
allocate(alocarray(1:assignme))
deallocate(alocarray)
end subroutine
! ************************************begin another file***********
MODULE module1
IMPLICIT NONE
real, dimension(:), allocatable :: alocarray
END MODULE module1
这个解决方案,模块的移除,是非常麻烦的,也是维护上的一大难题,因为我发布的代码问题非常大
环境:GNU Fortran编译器,windows 7 64位,Fortran代码块,VS2012,我没有更改任何编译器选项
有什么想法吗
感谢您抽出时间我们可以做的是将模块更改为派生类型,然后在每次调用中传递派生类型
module orig
use whatever
interfaces
small types
variables
contains
procedures
end module
到
每个线程都有自己的
状态
类实例,并显式地或作为传递的伪参数传递它。从您的代码中不清楚为什么数组首先应该在模块中,也不清楚为什么要将其设为本地数组是一个维护问题。您不必删除所有模块。这是一个示例代码来说明问题。代码的原始版本有50多个模块变量,位于两个模块中。这些变量在多个文件的多个函数中使用。想象一下,在几个函数的参数列表中添加这50个参数中的一部分是多么有趣。现在想象一下,如果您需要添加或删除一个参数,这就是程序设计的艺术,共享需要共享的内容,将非共享状态保留在派生类型中,而不是无法共享的模块中。对于一个具有类型绑定过程的类,几乎每个模块都可以用一种简单的方式进行更改。
module orig
use whatever
interfaces
small types
variables
contains
procedures
end module
module state_class
use whatever
interfaces
small types
shared variables
type state
non shared variables
contains
procedure :: the procedures
(not obligatory)
end type
contains
procedures changed to accept one additional argument:
a passed dummy argument class(state)
or just a regular dummy argument type(state)
end module