|
本帖最后由 weixing1531 于 2024-6-30 17:56 编辑
F2018标准进一步加强了与C语言交互,搞出来C descriptors这个新玩意,主要以结构体CFI_cdesc_t为载体用于C语言操作Fortran中动态数组、数组切片,指针、递延字符串、访问派生类型成员变量、访问二维数组元素、optional、TYPE(*)、DIMENSION(..)等高级特性。
以下是C descritors操作递延字符串的一个例子,使用C语言strtok函数模拟Fortran2023标准子程序split来分裂字符串。
系统环境:Windows10
编译器:SimplyFortran3.35+gnu14.1.0
C语言代码:
[C] 纯文本查看 复制代码 02 | #include "iso_fortran_binding.h" |
06 | void c_split( char *str, const char *ft, int *num,CFI_cdesc_t *ans){ |
13 | printf ( "++++++C函数内部计算过程开始++++++\n" ); |
17 | strncpy (out+len,token,width); |
18 | strncpy (out+len+width, "," ,1); |
20 | printf ( "[%d]:%s\n" ,*num,token); |
22 | token= strtok (NULL,ft); |
25 | strncpy (out+len, "\0" ,1); |
26 | printf ( "++++++C函数内部计算过程结束++++++\n" ); |
29 | if (CFI_deallocate(ans)) return ; |
33 | if (CFI_allocate(ans,(CFI_index_t*)0,(CFI_index_t*)0,len)) return ; |
34 | memcpy (ans->base_addr,out,len); |
Fortran代码:
[Fortran] 纯文本查看 复制代码 07 | subroutine c_split ( str , ft , num , ans ) bind ( c ) |
09 | character ( c_char ) , intent ( in ) :: str ( * ) , ft ( * ) |
11 | character ( : , c_char ) , allocatable , intent ( out ) :: ans |
15 | integer ( c_int ) :: r , g , b , num |
16 | character ( 255 ) :: temp_str |
17 | character ( : ) , allocatable :: str , sep |
18 | character ( : , c_char ) , allocatable :: ans |
20 | str = "SetColor(255,30,58)" |
21 | write ( * , "('原始字符串:',a)" ) str |
24 | call c_split ( str / / c_null_char , "(" / / sep / / ")" / / c_null_char , num , ans ) |
26 | write ( * , "('分裂个数:',i0)" ) num |
27 | write ( * , "('提取字符串长度:',i0)" ) len ( ans ) |
28 | write ( * , "('提取字符串长度(验算):',i0)" ) storage_size ( ans ) / storage_size ( ans ( 1 : 1 ) ) |
29 | write ( * , "('提取的字符串:',a)" ) ans |
30 | read ( ans , * ) temp_str , r , g , b |
31 | write ( * , "('rgb的数值分别为:',*(g0,:,','))" ) r , g , b |
33 | deallocate ( ans , str , sep ) |
|
|