使用 C 指针时,Fortran 数组的更改会导致另一个数组的更改
Change in a Fortran array results in change of another when using C pointers
我使用两个数组 f
和 g
的 FFTW3 使用相同的计划进行 C 型 SIMD 分配。我只是将 f
设置为 1
,然后将 g
设置为 f
,然后将 f
归零。这也最终归零 g
.
为什么会出现这种情况,有哪些方法可以确保通过切片等方式派生的数组不会被修改。
我希望f
和g
指向两个不同的二维双精度内存块。我没有使用通常的显式形状 (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
内存分配由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
指向另一个。
我使用两个数组 f
和 g
的 FFTW3 使用相同的计划进行 C 型 SIMD 分配。我只是将 f
设置为 1
,然后将 g
设置为 f
,然后将 f
归零。这也最终归零 g
.
为什么会出现这种情况,有哪些方法可以确保通过切片等方式派生的数组不会被修改。
我希望f
和g
指向两个不同的二维双精度内存块。我没有使用通常的显式形状 (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
内存分配由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
指向另一个。