概述
Fortran和C之间调用字符参数传递
-
C函数只接收字符数组首地址(char *指针),没有字符串概念。C中的字符串等价于以NULL结尾的字符数组
-
Fortran语言中有字符数组(e.g., characater(len=1)::CharArray(80))和字符串(e.g., character(len=80)::CharString)概念,两者不等价。Fortran字符串变量内含长度信息
-
将Fortran中的字符数组变量传给C函数很直接: 把字符数组首地址传给C函数即可,数组长度信息可以作为附加参数传给C函数,或是在字符数组合适位置设置NULL值;同理,将C中的字符串以字符数组形式传给Fortran: 首地址+长度信息
-
将Fortran中的字符串变量传给C函数: 用interface声明C函数原型,Fortran编译器会隐式的把字符串转成字符数组再传给C函数(语言标准定义)
-
对于返回字符串的Fortran函数如果在C端调用,没有标准的处理方式,因返回值需要动态申请内存资源,建议所有资源在主函数端申请释放,同时将有字符串作为返回值的函数(function)改写成过程(subroutine)调用
-
Fortran2018标准提供描述结构(CFI_cdesc_t, ISO_Fortran_binding.h)对Fortran的变量描述以供C端函数使用,通过构造CFI_cdesc_t描述结构,C端函数可按统一方式和Fortran变量类型进行互相操作
示例
-
示例: Fortran调用C函数
C函数
//file: printString.cpp #include<stdio.h> #ifdef __cplusplus extern "C"{ #endif void printString(char *str) { puts(str); return; } #ifdef __cplusplus } #endif
Fortran调用C函数
!file: main.F90 program main use,intrinsic:: iso_c_binding !C函数interface声明 interface subroutine printString(str) bind(C,NAME="printString") use iso_c_binding character(kind=c_char,len=1) :: str(*) end subroutine end interface character(kind=c_char, len=1):: str(10) !字符数组 str(1)='h' str(2)='e' str(3)='l' str(4)='l' str(5)='o' str(6)=achar(0) ! NULL结尾 !str(6)=c_null_char !NULL结尾 call printString(str) !调用C函数 block character(kind=c_char,len=80)::str str="world"//c_null_char !Fortran会隐式的把字符串转换成字符数组 call printString(str) end block stop end program main !compile & link ! gfortran -c main.F90 ! g++ -c printString.cpp ! gfortran -o a.out main.o printString.o
-
示例: C/C++调用Fortran函数
main.cpp//file: main.cpp #include <string.h> extern "C" { //Fortran 子程序声明 void printString(const char *str, size_t len); } int main(int argc, char **argv) { const char hello[]="hello"; //把字符串长度信息显示的传给Fortran printString(hello,strlen(hello)); return(0); } //compile & link //gfortran -c printString.F90 //g++ -c main.cpp //gfortran main.o printString.o
printString.F90
!字符数组+长度信息 subroutine printString(str,size) bind(C,NAME="printString") use,intrinsic::iso_c_binding integer(c_size_t),value,intent(in)::size character(kind=c_char,len=1),intent(in)::str(size) print*,"Fortran:", str end subroutine printString
最后
以上就是慈祥皮卡丘为你收集整理的Fortran: C函数之间传递字符串和字符数组变量Fortran和C之间调用字符参数传递的全部内容,希望文章能够帮你解决Fortran: C函数之间传递字符串和字符数组变量Fortran和C之间调用字符参数传递所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复