[英]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.