0

我正在用 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 字符串并将其传递给我无法更改的函数,但是我不知道该怎么做。有什么帮助吗?

4

2 回答 2

3

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

我会制作另一个 Fortran 包装器,它需要一个intwith 长度和一个长度字符数组,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可能是不必要的,因为二进制表示是相同的,试试吧。

于 2013-09-26T18:43:00.807 回答
1

你觉得这个页面能帮到你吗? http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/2011Update/fortran/lin/bldaps_for/common/bldaps_hndl_charstr.htm

于 2013-09-29T20:42:35.613 回答