我必须编写一个可由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', '!' /))
我的主要问题似乎是它不喜欢假定形状的数组,并且给它一个设置(大)大小也会输出之后碰巧被拾取的所有垃圾内存。
有更好的方法吗?
答案 0 :(得分:4)
序列关联规则允许类似的情况。你可以使用
call my_sub('Hello World!')
但仅当您将数组设为假定大小dimension(*)
或显式形状时。
通常,在Fortran 2008中,您不能将假定的形状数组用于C-可互操作的过程。这将改变我的未来,但会更复杂。
另一个重要的评论。仅使用iso_c_binding
模块不会使过程C-可互操作。 您必须使用bind(C)
,可能使用绑定名称。这是重要的事情。即使没有模块(只有有限的模块),您也可以创建可互操作的过程。传递字符串而不是1个字符数组的功能也取决于此。
这就是为什么我不喜欢说“使用iso_c_binding来创建可互操作的程序”。
过程的接口必须在Fortran中显式。
答案 1 :(得分:3)
您可以使用传输功能。这是一个示例代码。
program string0
implicit none
character, allocatable :: string(:)
character(len = :), allocatable :: text
text = 'this is a pen'
string = transfer(text, ' ', size = len_trim(text))
string = achar(iachar(string) - 32)
text = transfer(string, text)
print *, text
stop
end program string0