function - 初学者阅读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)
解决方案
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
,在索引处ibx
和iby
前两个维度,它包含第三个维度中的每隔一个值,从索引 2 开始,在 处停止flds%nc * flds%nl
。输出数组中的前两个维度被省略,因为这些维度中的索引是简单的标量。此表达式不能在语句中单独存在,因此我假设您在问题中留下了部分内容。
推荐阅读
- sql - 使用脚本将数据库架构和数据导出到 SQL 文件中
- scala - 将 Option[T] 添加到 Option[Seq[T]]
- sql - 使用 SQL 将每组的第二大项目与组中最大的项目进行比较
- makefile - Makefile 反复制作 .PHONY 目标
- java - 检索到太多行后,异步任务不起作用
- c# - 在 C# 中隐藏 VisualBasic CopyDirectory 的复制源
- javascript - 使用 PHP (codeigniter) 获取我添加的列中的所有值
- javascript - 500 内部错误 - 错误 TokenMismatchException
- google-bigquery - Big Query - 我是否需要为与他人共享的表(只有项目读取访问角色)付费?
- java - 获取 org.hibernate.MappingException:没有 JDBC 类型的方言映射:1111 使用 com.vladmihalcea:hibernate-types-5