从C调用FORTRAN子例程

从C调用FORTRAN子例程,第1张

概述我试图从C调用FORTRAN函数 我的问题是: >如果fortRoutine是我的fortran子例程的名称,那么我从C调用这个 作为fortRoutine_.如果fortRoutine只包含一个字符数组参数,那么我可以这样传递: fortRoutine_("I am in fortran"); >在调用FORTRAN子程序时,何时应该使用pass by value和通过引用? 因为我是C的新手, 我试图从C调用FORTRAN函数

我的问题是:

>如果fortRoutine是我的fortran子例程的名称,那么我从C调用这个
作为fortRoutine_.如果fortRoutine只包含一个字符数组参数,那么我可以这样传递:

fortRoutine_("I am in fortran");

>在调用FORTRAN子程序时,何时应该使用pass by value和通过引用?

因为我是C的新手,我对此没有任何线索.如果可能,请建议一些很好的教程链接.

解决方法 现在要做的就是在Fortran端使用Fortran ISO C Binding.这是Fortran 2003语言标准的一部分,并且可以在许多编译器中使用;它不是具体的gcc.这个网站已经在很多答案中描述过了.作为语言标准的一部分,它是编译器和平台无关的.并且您不需要知道编译器的内部传递约定. ISO C Binding在声明Fortran子程序或函数时使用时,会导致Fortran编译器使用C调用约定,以便可以从C直接调用该过程.您不需要添加隐藏的参数或命名mangle Fortran子例程名称,即没有下划线.链接器使用的名称来自“绑定”选项.

字符串是一个困难的情况,因为技术上在C它们是字符数组,你必须匹配在Fortran.您还必须处理字符串的不同定义:C为空终止,Fortran固定长度并填充空白.该示例显示了如何工作.数字更容易数组的唯一问题是C是行主和Fortran列主要,以便多维数组被转置.

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)   returnend subroutine myfortsub

您将C编译为对象文件,并使用gfortran编译fortran并链接两者:

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

输出为:

>abcd<           4
总结

以上是内存溢出为你收集整理的从C调用FORTRAN子例程全部内容,希望文章能够帮你解决从C调用FORTRAN子例程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1232714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存