无法在FORTRAN和C之间传递值

时间:2013-12-20 12:56:34

标签: c pointers segmentation-fault fortran

我在使用FORTRAN程序调用C函数时遇到问题。

我的情况是我将一个变量的地址作为FORTRAN的参数传递并在C中使用它并且在进行一些计算后返回相同的变量。

在C函数中,当我将参数声明为指针时,我能够在FORTRAN程序中获得所需的变量值,但它显示了分段错误。

但是如果我将参数声明为普通变量,那么我无法将该值传递回FORTRAN

一个例子是

档案:fortran_prog.f

program test
    integer :: a=10

    call c_func(a)
    write(*,*) a
end program test

档案:c_prog1.c

#include<stdio.h>
void c_func_(int *a) {
    int *b = 100;
    *a = *b
}

在这种情况下,我将'a'的值设为100,但在FORTRAN程序退出后也会显示Segmentation Fault。

但如果我像这样改变C程序

档案:c_prog2.c

#include<stdio.h>
void c_func_(int *a) {
    int b = 100;
    a = &b;
}

在这种情况下,我在FORTRAN程序中得到a的值为0。我找不到这种行为的原因

C prog用gccran编译gcc和FORTRAN程序。当使用GDB返回跟踪时,我收到了错误消息

  

编程接收信号SIGSEGV,分段故障。

     

0x00000000 in ?? ()

任何帮助/建议都将不胜感激。

PS:以上示例仅仅是复制实际程序的代码。

2 个答案:

答案 0 :(得分:0)

尝试:

#include<stdio.h>
void c_func_(int *a) {
    int b = 100;
    *a = b;
}

在第二个示例中,您将a的值设置为无效地址。据推测,在您从示例中省略的代码中,您稍后会在C函数中引用它并生成段错误。要分配a的值,您只需要取消引用分配的LHS。

答案 1 :(得分:0)

void c_func_(int *a) { int *b = 100; *a = *b }

你不是指int * b = 100,这意味着创建一个指向int的指针并将其指向内存位置100; 我至少假设你的意思

void c_func_(int *a) { int b = 100; *a = b }

或在您的示例中,您在堆栈中引用了一些未知值...

void c_func_(int *a) { int b = 100; a = &b; }

因为b存储在堆栈中而且&amp; b指向堆栈中的b,然后你设置a指向a的地址, 但是你不改变a的内容,因此结果不会改变。 您应该能够找到有关C&amp; C的文档。 Fortran可以在您的环境中组合使用。我假设这就是为什么你会遇到一些运行时错误 如果是我,我更喜欢以下API

int c_func_(int a) { int b = 10; return a * b; }

我建议阅读K&amp; R(http://en.wikipedia.org/wiki/The_C_Programming_Language)或其他一些解释指针,堆栈等的书....