使用C指针时,Fortran数组中的更改导致另一个数组中的更改

时间:2018-07-15 10:46:32

标签: arrays fortran fftw

我使用相同计划的两个数组fg的FFTW3进行C型SIMD分配。我只是将f设置为1,然后将g设置为f,然后将f置零。这也最终将g归零。

为什么会出现这种情况?有什么方法可以确保例如通过切片确保任何派生数组都不会被修改。

我希望fg指向两个不同的二维双精度内存块。我没有使用通常的显式形状(double precision, dimension(n,n))定义,因为FFTW3 documentation指出以这种方式分配的数组处理起来更快。

program main

use,intrinsic::iso_c_binding
implicit none
include 'fftw3.f03'

integer,parameter::n=16
real(C_DOUBLE),pointer::f(:,:),g(:,:)
type(C_PTR)::p

p=fftw_alloc_real(int(n**2,C_SIZE_T))
!i am thinking of these as FFTW plans that store only the stencil to
!allocate space starting from addresses given by real(C_DOUBLE),pointers above.

call c_f_pointer(p,f,[n,n])
call c_f_pointer(p,g,[n,n])

f=1.0d0
print*,sum(f)
g=f

f=0.0d0
print*,sum(g)

call fftw_free(p)
end program

输出为

256.00000000000000     
0.0000000000000000

1 个答案:

答案 0 :(得分:2)

内存分配由fftw_alloc_real完成。您只调用一次,因此只分配了一块内存。 c_f_pointer不执行任何分配。

c_f_pointer使用C指针,并且该指针将Fortran指针与C指针的目标相关联。

call c_f_pointer(p,f,[n,n])
call c_f_pointer(p,g,[n,n])

您正在将fg都与p所指向的相同的内存块相关联。

只需分配两个不同的部分,两次调用fftw_alloc_real,将f指向一个,将g指向另一个。