Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran和C的互操作性:从C接收返回值(从Fortran调用)_C_Fortran - Fatal编程技术网

Fortran和C的互操作性:从C接收返回值(从Fortran调用)

Fortran和C的互操作性:从C接收返回值(从Fortran调用),c,fortran,C,Fortran,我读过很多关于类似主题的帖子,但我还没有成功解决这个问题。 我应该提到的是,我为这篇文章简化了很多代码。 我的意图是通过从fortran77调用c函数并从c返回值来使用它。我提到FORTRAN77的事实是因为我想把我的代码链接到一个更大的使用FORTRAN77的项目,但是如果他们做这个工作,如果你相信他们会简化我的问题,我愿意考虑其他版本的FORTRAN解决方案。 我有两个文件:Try_stack.f和client2.c。 我将代码编译为: gcc -c client2.c gfortran -

我读过很多关于类似主题的帖子,但我还没有成功解决这个问题。 我应该提到的是,我为这篇文章简化了很多代码。 我的意图是通过从fortran77调用c函数并从c返回值来使用它。我提到FORTRAN77的事实是因为我想把我的代码链接到一个更大的使用FORTRAN77的项目,但是如果他们做这个工作,如果你相信他们会简化我的问题,我愿意考虑其他版本的FORTRAN解决方案。 我有两个文件:Try_stack.f和client2.c。 我将代码编译为:

gcc -c client2.c
gfortran -g Try_stack.f client2.o -o combined
我的Try\u stack.f文件:

      program circle

      call circle2
      stop
      end

      subroutine circle2 
      dimension rread(2)
      double precision r, area,rread
      external client

      area = 3.
      rread(1)=area
      rread(2)=area+10.
      write (*,*) 'Area = ',  rread(1)
      call client(rread)
      retNread = rread(1) * 2
      write(*,*) 'new nread is: ',retNread

      return
      end
和我的client2.c文件:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdint.h>

int client_(double rread[2]) 
{ 
    double result;
    result=1.;
    rread[1]=result;
    printf("%.2lf",rread);
    return 0; 
} 
#包括
#包括
#包括
#包括
int客户端(双rread[2])
{ 
双重结果;
结果=1。;
rread[1]=结果;
printf(“%.2lf”,rread);
返回0;
} 
运行编译版本后,我得到:

面积=3.0000000000000000
0.00新nread为:6.00000000

但是,我希望fortran程序的返回值等于8.000,而不是6.0000(因为fortran发送的值是3,1加上3,4.0应该返回fortran,以便与2相乘)。如果我想用一种简单的方式来解释它,我会说:

  • 首先,我希望fortran文件发送数字3。到c(实际上我想交换数组)

  • 第二,我希望c文件取3号。并添加1

  • 第三,我希望c将结果返回到fortran文件,即数字4

  • 最后,我希望fortran继续计算,在本例中,乘以4*2=8
我读了很多关于iso_c_绑定的书,但我显然没有设法使用它,而且如果我的理解是正确的,它需要Fortran的最新版本。
任何帮助都将不胜感激。

有很多评论,是否有人编译并尝试运行此代码? 除了FORTRAN(索引开始形式1)和C(索引开始形式0)之外,还有一个打字错误阻止您获得预期的结果

顺便说一句,请在任何FORTRAN中使用隐式none

int client_(double rread[2]) 
{ 
    double result;
    result=1.;
    //rread[1]=result; --> typo?
    rread[0]+=result;
    printf("%.2lf",rread);
    return 0; 
} 
面积=3.0000000000000000

0.00新的nread是:8.0000000000000000

你应该真正反思2019-1977=42。使用现代Fortran中提供的功能,Fortran和C之间的互操作性是微不足道的。顺便说一句,Fortran索引从1开始。C索引从2开始。如果您在Fortran代码中打印*,rread(1),rread(2)会发生什么?哇。C索引从0开始!我想要写的东西。C声明
double-rread[2]
是索引从0开始的2元素。@evets:你说得对。这是一个索引问题,尽管我已经意识到这两种语言之间的差异。谢谢你的快速回复。我欢迎现代fortran的更优雅的解决方案,尽管我现在只能阅读旧的解决方案。您的fortran代码
调用
s
客户端
,因此必须符合fortran子例程(而非函数)的约定。通常,我很确定gfortran在这里是典型的,一个Fortran子例程对应于一个返回类型为
void
的C函数。我想这不是您的主要问题,但您仍然应该解决它,而不是冒着出现微妙问题的风险。@JohnBollinger:您的意思是我应该将上面的“int client_uu2;(double rread[2])”更改为“void client_2;(double rread[2])”?