主题:请教Fortran调用C子程序的问题
ddbb12
[专家分:340] 发布于 2010-09-10 10:45:00
目前正在学习用Fortran做主程序,调用C语言子程序。程序可以正确编译,但是发现在数据交换上存在如下问题。
程序大体框架如下:
program main
a = fun1()
b= fun2()
end program
其中fun1和fun2都是c的子程序,调用正常。在C子程序中有一个变量(static定义的),在fun1和fun2中都使用过,并且没有经过显式的参数传递。
现在问题是,如果在Fortran主程序中试图输出这一参数就返回一个错误的值。请问,如何才能在主程序中调用或者访问这个值?
非常感谢!
回复列表 (共7个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2010-09-10 11:15:00
在C函数里多输出几个试试。
板凳
ddbb12 [专家分:340] 发布于 2010-09-10 11:59:00
已经测试,在调用的所有C子程序中都可以正确的输出该变量的值。
这是第一个问题,也是解决其他问题的关键,换种说法,如何把C子程序中产生的中间结果返回给Fortran主程序?需要在Fortran中再单独定义一套完全重复的变量么?我需要再这一组C子程序处理完数据后,继续用Fotran来处理所得到的数据。
请问,还有其他的方法么?除了上边说的这种。
猛然之间我觉得我这里说的不对,这个应该就是变量作用域的问题。那就换个提法:如何用Fortran主程序调用在C子程序中申明的全局变量?
3 楼
cgl_lgs [专家分:21040] 发布于 2010-09-10 12:09:00
你的C函数返回值是什么类型的呢?类型不要搞错了啊:)
如果没有在program main里定义,那fun则返回的是real类型的喔(double)
呵呵:)
4 楼
ddbb12 [专家分:340] 发布于 2010-09-10 12:22:00
[quote]你的C函数返回值是什么类型的呢?类型不要搞错了啊:)
如果没有在program main里定义,那fun则返回的是real类型的喔(double)
呵呵:)[/quote]
感谢,是这样我可能把问题还是没有说清楚。
C函数返回值并不是我需要的,在C函数运行过程中有一个中间值(就是static定义的应该是个全局变量,是在C程序里定义的,但不是函数中定义的),我想把这个中间值传回Fortran中。 这应该是我想要做的。 C函数本身的返回值没有什么意义,只是表示这个函数顺利执行完成而已。
我想了一下,把程序框架写下来可能有助于描述问题
下面是Fortran主程序框架:
program main
a=fun1()
b=fun2()
end
c的子程序大概如下:
#include .....
static int important
int fun1()
{
some statement
important = 100
}
int fun2()
{
printf("%d",important)
}
程序框架差不多如此,在Fortran主程序中调用这两个子程序fun1和fun2都没有问题,但是如果要在fortran主程序中试图输出important的时候,就会出现另外一个值。
问题可能这样描述比较清楚。请问,有什么方法能做到?谢谢!
5 楼
cgl_lgs [专家分:21040] 发布于 2010-09-10 13:24:00
program main
integer*4 fun1,fun2
na=fun1()
nb=fun2()
write(*,*)na,nb
end
注意:fun1与fun2的返回值类型需要声名一下:)
6 楼
ddbb12 [专家分:340] 发布于 2010-09-10 13:40:00
[quote]program main
integer*4 fun1,fun2
na=fun1()
nb=fun2()
write(*,*)na,nb
end
注意:fun1与fun2的返回值类型需要声名一下:)[/quote]
Sorry.
感谢您的指教。
我的问题是,我并不需要fun1和fun2的返回值,而是需要在fun1执行过程中产生的一个中间数据important,这个数据可以被fun2来调用(因此我觉得这个数据应该是全局变量)。我现在希望这个数据能在Fortran主程序中被调用。
另外,我需要的这个数据并不是C sub的返回值。
再一次感谢您!
7 楼
cgl_lgs [专家分:21040] 发布于 2010-09-10 16:17:00
那您只能用返回值的方法了。俺暂没有发现C的全书变量能被FORTRAN直接访问的方法,但有一点可以肯定的是,static变量是肯定不能被访问到的:)
我来回复