我传递一个用变量映射到Fortran子例程的Cray指针。说明如下:
program test
integer val
pointer (ptr_val, val)
print *, "1:", loc(val)
print *, "1:", ptr_val
CALL DPMALLOC(ptr_val, sizeof(val))
print *, "2:", loc(val)
print *, "2:", ptr_val
val = 999
call foo(val)
end program test
subroutine foo(val)
integer val
print *, "3:",val
print *, "3:", loc(val)
print *, "3:", ptr_val
call DPMALLOC(ptr_val, sizeof(val))
print *, "4:", ptr_val
print *, "4:", loc(val)
return
end subroutine foovoid dpmalloc_(void **data, int *size){
*data =(void *) malloc(*size);
printf("malloc\n");
}输出:
1: 0
1 0
2: 30743328
2: 30743328
3: 999
3: 30743328
3: 7.82827652E-38
4: 7.82833033E-38
4: 30743328因此,我似乎不能在子例程中使用全局指针。我怎么才能修好它?
发布于 2016-10-12 19:05:20
正如弗朗西夫斯指出的那样,你真的应该一直使用IMPLICIT NONE。这是非常重要的。如果您不必关心严格的FORTRAN77兼容性,因为Cray指针无论如何都是一个扩展。所以请使用IMPLICIT NONE!
这将告诉您,ptr_val在子例程中没有定义。
相反,您应该传递指针,而不是数组,并在子例程中再次声明指针关联:
program test
implicit none
integer val
pointer (ptr_val, val)
print *, "1:", loc(val)
print *, "1:", ptr_val
CALL DPMALLOC(ptr_val, sizeof(val))
print *, "2:", loc(val)
print *, "2:", ptr_val
val = 999
call foo(ptr_val)
end program test
subroutine foo(ptr_val)
implicit none
integer val
pointer (ptr_val, val)
print *, "3:",val
print *, "3:", loc(val)
print *, "3:", ptr_val
call DPMALLOC(ptr_val, sizeof(val))
print *, "4:", ptr_val
print *, "4:", loc(val)
return
end subroutine foo产出:
> ./a.out
1: 0
1: 0
malloc
2: 10391632
2: 10391632
3: 999
3: 10391632
3: 10391632
malloc
4: 10391392
4: 10391392https://stackoverflow.com/questions/39972004
复制相似问题