在C中调用一个子程序FORTRAN

在C中调用一个子程序FORTRAN

本文介绍了在C中调用一个子程序FORTRAN的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图调用从C FORTRAN函数

I am trying to call a FORTRAN function from C

我的问题是:


  1. 如果 fortRoutine 是我的FORTRAN程序的名字,然后我从C调用此
    fortRoutine _ 。如果 fortRoutine 只包含一个字符数组参数,那么可以通过我这样的:

  1. If fortRoutine is the name of my fortran subroutine, then I am calling this from Cas fortRoutine_. If fortRoutine contains only one character array argument, then can I pass like this:

fortRoutine_("I am in fortran");


  • 虽然调用子程序FORTRAN,我应该使用按值传递,当通过引用传递?

  • While calling FORTRAN subroutines, when should I use pass by value and when pass by reference?

    由于我是新的C,我没有这个线索。如果可能的话,请提出了一些很好的教程链接,以及

    As I am new to C, I do not have a clue about this. If possible, please suggest some good tutorial links as well.

    推荐答案

    现在要做到这一点的方法是使用Fortran ISO C绑定的Fortran的一面。这是Fortran 2003的语言标准的一部分,是许多编译器可用;它不是特定于GCC。它已经在这个网站很多答案被描述。作为语言标准的一部分,它是编译器和独立于平台的。而你并不需要了解编译器的内部传递约定。在ISO C绑定,在Fortran子例程或函数的声明中使用时,会导致Fortran编译器使用C调用约定,这样该程序可以通过C语言来直接调用你并不需要添加隐藏的参数或名称曼格莱Fortran的子程序名,即没有下划线。链接器使用的名字来自绑定选项。

    The way to do this now is to use the Fortran ISO C Binding on the Fortran side. This is part of the Fortran 2003 language standard and is available in many compilers; it is not specific to gcc. It has been described in many answers on this site. As part of the language standard, it is compiler and platform independent. And you do not need to know about the internal passing conventions of the compiler. The ISO C Binding, when used in the declaration of a Fortran subroutine or function, causes the Fortran compiler to use the C calling conventions so that that procedure can be directly called from C. You do not need to add hidden arguments or name mangle the Fortran subroutine name, i.e., no underscores. The name used by the linker comes from the "bind" option.

    字符串是一个很困难的情况,因为在技术上用C它们是字符数组,你必须在Fortran语言匹配这一点。你还必须处理字符串的定义不同:C是空终止,Fortran的固定长度和填充空格。这个例子显示了这一过程。数字更容易。与阵列唯一的问题是,C是行的主要和Fortran列主让多维数组换位。

    Strings are a difficult case because technically in C they are arrays of characters and you have to match this in the Fortran. You also have to deal with the different definitions of strings: C is null terminated, Fortran fixed length and padded with blanks. The example shows how this works. Numbers are easier. The only issue with arrays is that C is row-major and Fortran column-major so that multi-dimensional arrays are transposed.

    int main ( void ) {
    
       char test [10] = "abcd";
    
       myfortsub (test);
    
       return 0;
    
    }
    

    subroutine myfortsub ( input_string ) bind ( C, name="myfortsub" )
    
       use iso_c_binding, only: C_CHAR, c_null_char
       implicit none
    
       character (kind=c_char, len=1), dimension (10), intent (in) :: input_string
       character (len=10) :: regular_string
       integer :: i
    
       regular_string = " "
       loop_string: do i=1, 10
          if ( input_string (i) == c_null_char ) then
             exit loop_string
          else
             regular_string (i:i) = input_string (i)
          end if
       end do loop_string
    
       write (*, *) ">", trim (regular_string), "<", len_trim (regular_string)
    
       return
    
    end subroutine myfortsub
    

    您编译C到目标文件,然后使用gfortran编译Fortran和两个链接:

    You compile the C to an object file and use gfortran to compile the fortran and link both:

    gcc-mp-4.6   \
             -c  \
             test_fortsub.c
    
    gfortran-mp-4.6   \
         test_fortsub.o  \
         myfortsub.f90  \
         -o test_fortsub.exe
    

    输出是:

     >abcd<           4
    

    这篇关于在C中调用一个子程序FORTRAN的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

  • 09-05 06:43