Fortran 向 C 传递成员带有指针的结构体,该成员指针到C中无效
如 Fortran 中有一个 TYPE 定义为
TYPE SOMETYPE
INTEGER NX
INTEGER NY
INTEGER I
REAL R
LOGICAL L
INTEGER, DIMENSION(:,:,:),POINTER :: M
INTEGER, DIMENSION(:,:), POINTER :: N
END TYPE SOMETYPE
然后在 Fortran 中为成员数组指针 M 和 N 分配空间并初始化, 调用 C 函数 func
PROGRAM TEST
INTEGER O, P, Q
TYPE (SOMETYPE) :: T
ALLOCATE(T%M(3,4,5))
ALLOCATE(T%N(3,4))
T%NX = 3
T%NY = 4
T%I = 3123;
T%L = .TRUE.;
T%R = 7.414;
DO O = 1, 3
DO P = 1, 4
DO Q = 1,5
T%M(O,P,Q) = O*100+10*P+Q
T%N(O,P) = T%M(O,P,Q)-Q
WRITE(*,*) O, P, Q, T%M(O,P,Q)
ENDDO
END DO
ENDDO
CALL FUNC(T)
END
在 C 中尝试输出结构体中内容
#define D3(p, q1, q2, q3) (*(p+q3*nx*ny+q2*nx+q1))
struct sometype{
int nx;
int ny;
int i;
float r;
int l;
int *n;
int *m;
};
void func_(struct sometype *t){
int nx = t->nx;
int ny = t->ny;
int o, p, q;
printf("nx, ny == %d, %d\n", nx, ny);
printf("i == %d\n", t->i);
printf("l == %d\n", t->l);
printf("r == %f\n", t->r);
for(o = 0; o < 3; ++ o){
for(p = 0; p < 4; ++ p){
for(q = 0; q < 5; ++ q){
printf("%d\t%d\t%d\t%d\n", o+1, p+1, q+1, D3(t->m, o, p, q));
//D3是宏,相当于访问 M[o][p][q]
}
}
}
}
但是运行一下,就会发现M的指针无效,segmentation fault
当我把 M 作为一个单独的指针传入 C 函数 func,就可以访问了。但是我在另一个程序中有很多这样的指针,总不能一个个显性地传过去吧。
请教怎么从 Fortran 到 C 传包含指针成员的结构体才是正确的姿势。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
今天才知道原问题在哪,那个指针指向的成员没有实例化……
不过这个我还是不太明白这个示例问题错在哪