c - 如何创建一个接口(interface)来为 fortran 转换 c 字符数组

标签 c arrays fortran character-arrays language-interoperability

我正在用 c 为 fortran 程序编写一个模块,我需要将一些字符串传递给 fortran 程序。我无法修改 Fortran 代码,但可以编写自己的 Fortran 代码来调用现有代码。我试过用谷歌搜索这个,有很多不同的方法是在我不理解的水平上编写的。

c 字符串是可变长度的(尽管它是在传递之前设置的)。 Fortran“字符串”被声明为字符*(*),所以我看不到字符数组需要填充到的长度。下面是一些代码片段,看看我需要做什么。

我写的c函数:

void c_func(int db_handle) {
  char *geom_name;
  int geom_handle = 0;

  size_t geom_name_len = db_get_len(db_handle); !gets the length of the name
  geom_name = (char *)malloc(sizeof(char*(geom_name_len+1)));
  db_pull(db_handle, geom_name); !pulls geom_name from db as a null terminated string
  call_fortan_function(geom_handle, geom_name); !The fortran function will set the integer
  ...}

我无法修改的 fortran 函数用名称做一些事情,然后为句柄设置一个值:

logical function f_fn(handle, name)

integer handle
character*(*) name

我假设最好的方法是创建一个单独的 c 函数,将 geom_name 解析为一些 fortran 将使用的东西,然后一个 fortran 函数来创建 fortran 字符串并将其传递给我不能的函数改变,但我不知道该怎么做。有帮助吗?

最佳答案

您不能从 C 中可移植地调用需要 character(*) 的 Fortran 过程。这是不可能的,因为该过程通常采用另一个定义字符串长度的参数。您可能会尝试猜测它的格式,可能它是附加的 int 作为最后一个参数。

我会制作另一个 Fortran 包装器,它将采用一个具有长度的 int 和一个长度为 length 的字符数组,最好没有尾随 \0.

logical function f_wrap(handle, name, length) bind(C,name="f_wrap")
  use iso_c_binding
  integer(c_int),value :: handle
  integer(c_int),value :: length
  character(1,kind=c_char),intent(in) :: name(length)
  character(length) :: tmp

  tmp = name
  f_wrap = f_fn(int(handle), tmp)
end function

tmp 可能不需要,因为二进制表示是一样的,试试吧。

关于c - 如何创建一个接口(interface)来为 fortran 转换 c 字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19034668/

相关文章:

fortran - 如何在 Fortran 2018 中访问远程团队

fortran - 当输入名单文件中缺少名单变量时如何引发运行时错误?

fortran - 以 '#' 开头和/或以 'c' 结尾的常量在 Fortran 中意味着什么?

c - 在 C 应用程序中包含第三方库

javascript - Ramda 在 javascript 中的数组

c# - 如何将值插入数组并保持顺序?

java - 用另一个模式替换二维数组中的模式

c - 警告此代码无效

c - 使用fopen/write时出现汉字问题

c - execv 并测试正确的绝对路径