Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 假定大小数组:冒号与星号-维度(:)arr与arr(*)_Arrays_Fortran_Fortran90 - Fatal编程技术网

Arrays 假定大小数组:冒号与星号-维度(:)arr与arr(*)

Arrays 假定大小数组:冒号与星号-维度(:)arr与arr(*),arrays,fortran,fortran90,Arrays,Fortran,Fortran90,这两种声明假定大小数组的方法有什么区别吗 e、 g 及 形式 real, dimension(:) :: arr 声明一个假定的形状数组,而窗体 real :: arr(*) 声明一个假定大小的数组 而且,是的,它们的使用也有区别。产生差异的原因是,编译器大致“知道”假定形状数组的形状,但不知道假定大小数组的形状。编译器可用的额外信息意味着,除其他外,假定的形状数组可以在整个数组表达式中使用。当假定大小数组是过程引用中不需要数组形状的实际参数时,它只能在整个数组表达式中使用。哦,也是在调用内

这两种声明假定大小数组的方法有什么区别吗

e、 g

形式

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(*)