C语言结构体里有指针成员,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 传包含指针成员的结构体才是正确的姿势。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值