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
生命周期。
答案 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];