Arrays 假定大小数组:冒号与星号-维度(:)arr与arr(*)
这两种声明假定大小数组的方法有什么区别吗 e、 g 及 形式Arrays 假定大小数组:冒号与星号-维度(:)arr与arr(*),arrays,fortran,fortran90,Arrays,Fortran,Fortran90,这两种声明假定大小数组的方法有什么区别吗 e、 g 及 形式 real, dimension(:) :: arr 声明一个假定的形状数组,而窗体 real :: arr(*) 声明一个假定大小的数组 而且,是的,它们的使用也有区别。产生差异的原因是,编译器大致“知道”假定形状数组的形状,但不知道假定大小数组的形状。编译器可用的额外信息意味着,除其他外,假定的形状数组可以在整个数组表达式中使用。当假定大小数组是过程引用中不需要数组形状的实际参数时,它只能在整个数组表达式中使用。哦,也是在调用内
real, dimension(:) :: arr
声明一个假定的形状数组,而窗体
real :: arr(*)
声明一个假定大小的数组
而且,是的,它们的使用也有区别。产生差异的原因是,编译器大致“知道”假定形状数组的形状,但不知道假定大小数组的形状。编译器可用的额外信息意味着,除其他外,假定的形状数组可以在整个数组表达式中使用。当假定大小数组是过程引用中不需要数组形状的实际参数时,它只能在整个数组表达式中使用。哦,也是在调用内在的lbound
——但不是在调用内在的ubound
。仔细阅读标准或一本好的Fortran书籍,你会发现还有其他微妙的、不那么微妙的差异
对新Fortran程序员的一些建议是在可能的情况下使用假定的形状数组。它们在Fortran 90之前是不可用的,因此您将在旧代码中看到许多假定大小的数组。假设形状数组在新代码中更好,因为shape
和size
函数可用于查询它们的大小,以避免越界错误,并分配其大小取决于输入数组的大小的数组。解释了这两个语句之间的差异-简言之:是,这是有区别的;只有一个声明了一个假定大小的数组——及其含义
但是,正如前面提到的dimension(:)
但是,似乎与dimension(*)相反,我将添加一件事
real, dimension(:) :: arr1
real, dimension(*) :: arr2
相当于
real :: arr1(:)
real :: arr2(*)
甚至使用维度
语句。[我不想鼓励这样做,所以我不会写下这个例子。]
这个问题的重要区别在于使用了*
和:
,而不是维度
也许有一些假定的大小与伪参数的混淆?这是一个最常见的伪参数。应该注意的是,现代的假定形状(:)
形式需要一个明确的接口。如果使用外部子例程处理旧代码,则必须使用*
或提供接口。@agentp:为了明确编码,最好尽可能提供接口,而不是*
。更好的是,如果合适的话,将例程粘贴到模块中,因为使用模块时不需要接口。
real, dimension(:) :: arr1
real, dimension(*) :: arr2
real :: arr1(:)
real :: arr2(*)