我是靠谱客的博主 慈祥皮卡丘,最近开发中收集的这篇文章主要介绍Fortran: C函数之间传递字符串和字符数组变量Fortran和C之间调用字符参数传递,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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之间调用字符参数传递所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部