我有一个非常简单的程序让我非常困惑。对c_f_pointer的调用不起作用,显然我犯了很多错误!
program test
use iso_c_binding
implicit none
interface
subroutine call_fc(size,status) bind(C,name='call_fc_')
import
integer(c_int) :: size
type(c_ptr) :: status
end subroutine
end interface
integer(c_int) :: size=8,i
integer(c_int),pointer :: stat(:)
type(C_ptr) :: statptr
call call_fc(size, statptr)
call c_f_pointer(statptr,stat,(/size/))
print *, 'stat is : ',stat
end program test
并且c ++子例程是
extern "C" {
void call_fc_(int *size, int *status)
{
int i;
for(i=0; i<*size;i++) {
status[i] = i+10;
printf("%d th value : %d \n", i, status[i]);
}
}
}
当我编译并运行代码时,它将产生以下错误
0 th value : 10
1 th value : 11
2 th value : 12
3 th value : 13
4 th value : 14
5 th value : 15
6 th value : 16
7 th value : 17
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
有人可以告诉我出了什么问题吗?
答案 0 :(得分:1)
没有为stat
/ status
分配内存。
如果目标是将整数数组传递给C ++子例程,则不需要c_f_pointer
:
program test
use iso_c_binding
implicit none
interface
subroutine call_fc(size,status) bind(C,name='call_fc_')
import c_int
integer(c_int) :: size
integer(c_int) :: status(size)
end subroutine call_fc
end interface
integer(c_int), parameter :: size=8
integer(c_int) stat(size)
call call_fc(size, stat)
print *, 'stat is : ',stat
end program test
答案 1 :(得分:1)
非常感谢。 我的问题刚刚解决了,这个例子的目的只是在C或C ++子程序中分配一个内存并将分配的内存传递给FORTRAN,另外,我也知道没有必要这样做。
program test
use iso_c_binding
implicit none
interface
function call_fc(size) bind(C,name='call_fc')
import :: c_int, c_ptr
integer(c_int) :: size
type(c_ptr) :: call_fc
end function
end interface
integer(c_int) :: size=8,i
integer(c_int),pointer :: stat(:)
call c_f_pointer(call_fc(size),stat,(/size/))
print *, 'stat is : ',stat
end program test
并且c ++子例程是
extern "C" {
void * call_fc(int *size)
{
int i;
int * status = new int [*size];
for(i=0; i<*size;i++) {
status[i] = i+10;
printf("%d th value : %d \n", i, status[i]);
}
return status;
}
}
当我编译并运行代码时,它将产生正确的答案
0 th value : 10
1 th value : 11
2 th value : 12
3 th value : 13
4 th value : 14
5 th value : 15
6 th value : 16
7 th value : 17
stat is : 10 11 12 13 14 15 16 17
答案 2 :(得分:0)
我还要补充一点,如果你因某种原因需要通过type(c_ptr)
(例如,为了能够通过null
),你必须使用value
属性,如果C侧的参数只是一个按值传递的指针,如例子所示。
interface
subroutine call_fc(size,status) bind(C,name='call_fc_')
import
integer(c_int) :: size
type(c_ptr), value :: status
end subroutine
end interface
即使在那之后你的特定C程序要求传递的指针指向一些有效的内存(大小为size*sizeof(int)
)。