簡體   English   中英

如何創建接口以將AC字符數組轉換為fortran

[英]How do I create an interface to convert a c character array for fortran

我正在用C為一個fortran程序編寫一個模塊,我需要將一些字符串傳遞給fortran程序。 我無法修改fortran代碼,但是可以編寫自己的fortran代碼來調用現有代碼。 我已經嘗試過使用Google搜索,但是有很多不同的方法以我不理解的水平編寫。

c字符串的長度可變(盡管在傳遞之前已設置)。 fortran“字符串”被聲明為character *(*),因此我看不到需要填充字符數組的長度。 這是一些代碼片段,以查看我需要做什么。

我正在編寫的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可能是不必要的,因為二進制表示形式是相同的,請嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM