我在使用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:以上示例仅仅是复制实际程序的代码。
答案 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)或其他一些解释指针,堆栈等的书....