回 帖 发 新 帖 刷新版面

主题:请教Fortran调用C子程序的问题

目前正在学习用Fortran做主程序,调用C语言子程序。程序可以正确编译,但是发现在数据交换上存在如下问题。

程序大体框架如下:

program main
   a = fun1()
   b= fun2()
end program

其中fun1和fun2都是c的子程序,调用正常。在C子程序中有一个变量(static定义的),在fun1和fun2中都使用过,并且没有经过显式的参数传递。

现在问题是,如果在Fortran主程序中试图输出这一参数就返回一个错误的值。请问,如何才能在主程序中调用或者访问这个值?

非常感谢!

回复列表 (共7个回复)

沙发

在C函数里多输出几个试试。

板凳

已经测试,在调用的所有C子程序中都可以正确的输出该变量的值。

这是第一个问题,也是解决其他问题的关键,换种说法,如何把C子程序中产生的中间结果返回给Fortran主程序?需要在Fortran中再单独定义一套完全重复的变量么?我需要再这一组C子程序处理完数据后,继续用Fotran来处理所得到的数据。

请问,还有其他的方法么?除了上边说的这种。



猛然之间我觉得我这里说的不对,这个应该就是变量作用域的问题。那就换个提法:如何用Fortran主程序调用在C子程序中申明的全局变量?

3 楼

你的C函数返回值是什么类型的呢?类型不要搞错了啊:)
如果没有在program main里定义,那fun则返回的是real类型的喔(double)
呵呵:)

4 楼

[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 楼

program main
    integer*4 fun1,fun2
    na=fun1()
    nb=fun2()
    write(*,*)na,nb
end

注意:fun1与fun2的返回值类型需要声名一下:)

6 楼

[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 楼

那您只能用返回值的方法了。俺暂没有发现C的全书变量能被FORTRAN直接访问的方法,但有一点可以肯定的是,static变量是肯定不能被访问到的:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册