3

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

我目前正在尝试从 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存储它们usedestroy

4

2 回答 2

5

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

于 2012-06-13T20:02:25.657 回答
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];
于 2012-06-13T19:41:05.897 回答