gpt4 book ai didi

arrays - 在 Fortran 中,传递 myArray 或 myArray( :) to a function?

转载 作者:行者123 更新时间:2023-12-02 11:57:40 27 4
gpt4 key购买 nike

正如标题所说,我感兴趣的是数组本身和数组子集之间的类型差异。作为背景,我将数组传递到 MPI 函数中,当使用零长度数组调用时,该函数会触发“数组索引越界”错误,但仅使用子集表示法。这是当前问题的简化示例:

real(4), allocatable :: myData(:)

allocate(myData(numElements), STAT=iStat)

! The following calls only differ in the second argument
! Passing array itself always works (e.g. myData)
call MPI_FILE_WRITE_ALL(file, myData, MPI_REAL4, numElements, &
MPI_STATUS_IGNORE, mpiErr)

! Passing converted subset always works (e.g. real(myData(:), 4)
call MPI_FILE_WRITE_ALL(file, real(myData(:), 4), MPI_REAL4, numElements, &
MPI_STATUS_IGNORE, mpiErr)

! Passing subset works unless numElements is zero
call MPI_FILE_WRITE_ALL(file, myData(:), MPI_REAL4, numElements, &
MPI_STATUS_IGNORE, mpiErr)

这里是 documentation for MPI_FILE_WRITE_ALL 的链接,但似乎只需要 BUFFER(*)。对于为什么这些不同的调用表现如此不同有什么想法吗?

最佳答案

回答有关您标题的问题:

当传递数组切片时,必须创建一个临时数组,并且必须将数据复制到其中,当传递整个数组时,这不是必需的,并且使用对原始数组的引用而不是进行复制。

正如 M.S.B. 提供的链接和评论中提到的,传递切片也会导致数组边界信息的丢失。

关于arrays - 在 Fortran 中,传递 myArray 或 myArray( :) to a function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22866381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com