首页 > 解决方案 > 初学者阅读fortran代码但无法理解这一点

问题描述

我正在尝试理解 Fortran 代码进行实习,但我是一名 C++ 程序员,我被这个代码位的作用所困扰。有人可以启发我吗?

real(kind=kind_real), pointer :: c(:,:,:)  (I think this created a pointer to a matrix )

self%c => self%gfld3d(:,:,ioff+1:) (this is in the constructor of the class)

flds%c(ibx,iby,2:flds%nc*flds%nl:2) (this is a function that calls the c variable of the class but I don't understand how the parameters work and what does the colon operator do as a a parameter)

标签: functionparametersfortran

解决方案


  • real(kind=kind_real), pointer :: c(:,:,:)

正如你已经写过的,这一行声明了一个指针变量c,它指向一个 3 维数组real类型的数字kind_real。这里的冒号意味着每个维度的大小都是未知的。假设这是在一个type块内,c是该类型的一个成员。请注意,在 Fortran 中,()用于数组下标和函数调用。

  • self%c => self%gfld3d(:,:,ioff+1:)

在构造函数中,指针被分配了一个目标,该目标是 3 维数组的一部分self%gfld3d,也是同一类型的成员。Fortran 中的指针包含有关它们指向的数组切片的维度的信息。在这种情况下,前两个冒号表示数组切片跨越目标数组的整个两个第一维度。ioff+1:表示在第三维中,指针目标包括self%gfld3d从给定值开始的所有值ioff+1。这是一般切片表示法的简化情况,其中a(start:end:step)表示数组的切片a,从 index 开始start,到 结束end,步长为step

  • flds%c(ibx,iby,2:flds%nc*flds%nl:2)

基于上述,这不是函数调用。它是一个计算结果为一维、非连续数组切片的表达式。从 的目标flds%c,在索引处ibxiby前两个维度,它包含第三个维度中的每隔一个值,从索引 2 开始,在 处停止flds%nc * flds%nl。输出数组中的前两个维度被省略,因为这些维度中的索引是简单的标量。此表达式不能在语句中单独存在,因此我假设您在问题中留下了部分内容。


推荐阅读