首页 > 解决方案 > 使用 C 指针时,Fortran 数组的更改会导致另一个数组的更改

问题描述

f我使用两个数组的 FFTW3并g使用相同的计划进行 C 型 SIMD 分配。我只是简单地设置f1,然后设置gf,然后归零f。这也最终归零g

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

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

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

标签: arraysfortranfftw

解决方案


内存分配由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])

您将两者联系在一起f,并g与同一块内存相关联,即p.

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


推荐阅读