从Fortran调用C:``void *``返回值

时间:2012-06-13 19:07:46

标签: fortran

如何从Fortran调用void *function(...)

我目前正在尝试从Fortran调用一些C函数。我以前这样做过,但我只调用了自己的功能。例如,要致电:

void add(int *csum, int *ca, int *cb) { *csum = *ca + *cb; }
来自Fortran,我用过:

INTEGER :: fsum, fa, fb
CALL add(fsum, fa, fb)

这很好用。现在我有几个大致类似的功能:

void *create_obj(void);
void use_obj(void *obj);
void free_obj(void *obj);

甚至:

struct private_struct; /* defined somewhere else */
struct private_struct *create_p(void);
void use_p(struct private_struct *p);
void free_f(struct private_struct *p);

结构是私有的,即我不知道它的成员。

问题: 如何将返回值输入Fortran?我真的不需要访问它们,但我必须存储它们以某种方式create ... use ... destroy生命周期。

2 个答案:

答案 0 :(得分:5)

您可以在C中创建对象,将指针传递给Fortran,然后将该指针传递给C例程。最后,调用C例程来释放内存。 ISO C Binding提供Fortran类型C_PTR。

答案 1 :(得分:1)

不是返回指向对象的指针,而是将其保存在C库中的数组(或其他容器)中,并返回并索引到数组中(或适合容器的任何内容)。

int create_obj(); // returns the obj_id
void use_obj(int *obj_id);
void free_obj(int *obj_id);

您必须继续计算正在使用的数组元素。像

这样的东西
struct Entry {
    bool used;
    struct Obj value; 
}
Entry objects[100];