我必须编写一个可以由C和Fortran调用的子例程。该子例程将文件名作为其参数之一。我知道为了与C很好地互操作,ISO C绑定建议使用字符数组进行互操作。
我的问题是:是否存在诸如字符数组文字这样易于编写的东西?我有一个像这样的子程序:
subroutine my_sub(char_array)
use iso_c_binding, only: c_char
char(kind=c_char, len=1), dimension(:), intent(in) :: char_array
...
end subroutine my_sub
是否可以用以下方式调用此方法:
call my_sub('Hello World!')
还是我必须做一些可怕的事情:
call my_sub((/ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' /))
我的主要问题似乎是,它不喜欢假定形状的数组,并且给它设置了一个(大)大小也将输出所有碰巧在之后被拾取的垃圾内存。
有更好的方法吗?
序列关联规则允许类似的情况。您可以使用
call my_sub('Hello World!')
但前提是您要使数组具有假定的大小dimension(*)
或明确的形状。
通常,在Fortran 2008中,不能将假定的形状数组用于C互操作过程。这将改变我的未来,但会更加复杂。
另一重要提示。仅使用iso_c_binding
模块并不能使过程C互操作。您必须使用bind(C)
,可能使用绑定名称。那很重要。即使没有模块(仅有限模块),您也可以创建可互操作的过程。传递字符串而不是1个字符的数组的功能也取决于此。
这就是为什么我不喜欢说“使用iso_c_binding创建可互操作的过程”的原因。
该过程的接口必须在Fortran中显式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句