Fortran和C的互操作性:从C接收返回值(从Fortran调用)
我读过很多关于类似主题的帖子,但我还没有成功解决这个问题。 我应该提到的是,我为这篇文章简化了很多代码。 我的意图是通过从fortran77调用c函数并从c返回值来使用它。我提到FORTRAN77的事实是因为我想把我的代码链接到一个更大的使用FORTRAN77的项目,但是如果他们做这个工作,如果你相信他们会简化我的问题,我愿意考虑其他版本的FORTRAN解决方案。 我有两个文件:Try_stack.f和client2.c。 我将代码编译为:Fortran和C的互操作性:从C接收返回值(从Fortran调用),c,fortran,C,Fortran,我读过很多关于类似主题的帖子,但我还没有成功解决这个问题。 我应该提到的是,我为这篇文章简化了很多代码。 我的意图是通过从fortran77调用c函数并从c返回值来使用它。我提到FORTRAN77的事实是因为我想把我的代码链接到一个更大的使用FORTRAN77的项目,但是如果他们做这个工作,如果你相信他们会简化我的问题,我愿意考虑其他版本的FORTRAN解决方案。 我有两个文件:Try_stack.f和client2.c。 我将代码编译为: gcc -c client2.c gfortran -
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.00000000000000000.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
任何帮助都将不胜感激。有很多评论,是否有人编译并尝试运行此代码? 除了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.00000000000000000.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])”?