arrays - 使用 C 指针时,Fortran 数组的更改会导致另一个数组的更改
问题描述
f
我使用两个数组的 FFTW3并g
使用相同的计划进行 C 型 SIMD 分配。我只是简单地设置f
为1
,然后设置g
为f
,然后归零f
。这也最终归零g
。
为什么会出现这种情况,以及我可以通过哪些方法来确保任何派生数组都不会被修改,例如切片。
我想指出两个不同f
的g
二维双精度内存块。我没有使用通常的显式形状 ( 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
解决方案
内存分配由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
另一个。
推荐阅读
- python - 为什么使用类方法而不是只使用类名作为实例?
- d3.js - 有没有办法改变鼠标悬停时的c3js堆积面积图不透明度
- sendkeys - Pywinauto Sendkeys 函数
- .net - 如何在多线程函数中修改全局数组
- mysql - mysql在一个月内每天获取客户端的平均值
- tensorflow - 初始化权重的值应该是多少
- python - 创建一个新函数或只是普通打印以从另一个函数中获取值
- python - 如何将 weekday_name 函数用于日期时间的日/月/年格式
- android - Android - 默认警报对话框按钮位置到对话框底部
- autodesk-forge - 如何使用 Autodesk.Beeline