初学者阅读fortran代码,但无法理解这一点

时间:2019-06-24 08:09:07

标签: function parameters 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)

2 个答案:

答案 0 :(得分:5)

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

正如您已经写过的那样,此行声明了一个指针变量c,该变量指向类型为real的{​​{1}}数字的3维数组。这里的冒号表示每个尺寸的大小未知。假设它在kind_real块中,则type是该类型的成员。请注意,在Fortran中,c既用于数组下标又用于函数调用。

  • ()

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

  • end

基于以上所述,这不是函数调用。它是一个表达式,计算结果为一维非连续数组切片。从step的目标开始,在前两个维度的索引flds%c(ibx,iby,2:flds%nc*flds%nl:2)flds%c处,它包含第三个维度的第二个值,从索引2开始并在{{1 }}。输出数组中的前两个维被省略,因为这些维中的索引是简单的标量。该表达式不能在语句中单独使用,因此我假设您在问题中遗漏了该行的某些部分。

答案 1 :(得分:2)

除了注释: 除非另有明确定义,否则fortran数组始终以元素编号1开头,然后直到维度为止都具有元素编号1。

real(kind=kind_real), dimension(3) :: a
real(kind=kind_real), dimension(0:2) :: b
real(kind=kind_real), dimension(5:7) :: c

这三个静态,实值数组每个都有三个元素。数组'a'从元素a(1)开始,数组b从元素b(0)开始,c从元素c(5)