先说问题:
实际应用中会遇到这样的问题:读取一个文件获取一些数据。我把这个做成子程序,封装在DLL中,以便不同程序调用。
[Fortran] 纯文本查看 复制代码 subroutine read_data(file_name,num_data,iv_data)
!DEC$ ATTRIBUTES STDCALL,REFERENCE,DLLEXPORT,ALIAS:"read_data"::read_data
implicit none
character(*),intent(in) :: file_name
integer,intent(out) :: num_data
integer,allocatable,intent(out) :: iv_data(:)
! 读取文件,获取数据,得到 num_data,iv_data……
!代码略
allocate(iv_data(num_data))
iv_data = 88
return
end subroutine
然后在主程序用调用这个dll中的子程序,获取数据,得到 num_data,iv_data……
[Fortran] 纯文本查看 复制代码 program main
implicit none
character(256):: file_name
integer :: num_data
integer,allocatable :: iv_data()
file_name = "1.txt"
call read_data(file_name,num_data,iv_data)
deallocate(iv_data)
stop
end program
这个时候经常遇到一个问题:程序出错退出了。
以前群主说过,“谁打开,谁关闭;谁声明,谁分配,谁释放”
所以上面这么用就不行,得先得到数据个数,再在主程序中分配好,然后再传给dll中的函数,写起来要麻烦一些。
但是为什么,同样的编译器(IVF),有时候这么用又没有问题?
之前按照上面的示例的方式写了很多这样的dll子程序。现在只能是遇到一个出问题了,改一个,心里始终没底。
这个有没有一个固定的规则?
是不是dll中供外部程序调用的子程序的输出参数就一定不能是变长数组?
还请大家不吝赐教为谢!
|