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
Fortran。下面显示的代码中哪一个是正确的?_Fortran - Fatal编程技术网

Fortran。下面显示的代码中哪一个是正确的?

Fortran。下面显示的代码中哪一个是正确的?,fortran,Fortran,我在Fortran中发现了下一个有趣的东西。代码示例如下所示 我不明白,也没有发现为什么标签10和12上的代码有效,而标签11和13上的代码无效 implicit none integer :: i integer :: IA(8) = [(i, i=1,8)] integer :: IP IP = 5 10 IA(IP:2) = [11, 12] ! works 11 IA(5:2) = [11, 12] ! doesn't work 12 p

我在Fortran中发现了下一个有趣的东西。代码示例如下所示

我不明白,也没有发现为什么标签10和12上的代码有效,而标签11和13上的代码无效

implicit none
integer     :: i
integer     :: IA(8) = [(i, i=1,8)]
integer     :: IP

IP = 5
10  IA(IP:2) = [11, 12]     ! works
11  IA(5:2) = [11, 12]      ! doesn't work
12  print *, IA(IP:IP+1)    ! works 
13  print *, IA(IP:2)       ! doesn't work

区别是什么?

标记为10和11的语句的两个版本都是错误的

数组段ia5:2是由数组ia的零个元素组成的数组段。当IP是值为5的变量时,数组段iaIP:2是相同的

在数组元素下标中使用文字常量时,编译器在编译时知道它可以检查左右两侧的形状是否匹配。这里的编译器已确定ia5:2的形状为[0],而[11,12]的形状为不可编译形状[2]。因此,它会报告错误

编译器在编译时未检测到iaIP:2中具有非常量下标的错误。但是,该代码以完全相同的方式违反了Fortran标准。您看到的看似正确的输出是坏运气

您的编译器可能在运行时没有检测到错误,这可能是因为您使用了编译选项,或者是因为它没有正确应用形状测试

其他编译器很可能会抱怨,例如:

Rank 1 of constant array operand has extent 2 instead of 0
Program terminated by fatal error
Abort (core dumped)
我同意你的说法

print *, IA(IP:2)
这在其他格式正确的程序中确实有效。然而,它遭受着与以前完全相同的误解

与两个元素ia5:6相比,此print语句打印出ia的零个数组元素。没有明显的输出不是不工作,而是正确地不打印任何内容/空白行


总之,ia5:2并不是指ia5之后的两个元素,包括ia5。为此,您需要ia5:6或iaip:ip+1。下标都是界,而不是界和计数。

标记为11的语句与标记为10的语句一样错误,那么一个有效,一个不有效是什么意思?我假设编译器在被要求编译一个时会抱怨:请显示错误消息和编译时使用的选项,并提及哪个编译器。gfortran-9:错误:维度1 0和2上的数组赋值的形状不同,但10处的代码有效。IP=5。不,它不是。它不会生成编译器错误,因为编译器在编译期间不会检查变量的值。如果清除了所有其他错误,得到一个已编译的程序,那么标记为10的行将得到一个运行时错误,因为当IP=5时,IAIP:2的长度与[11,12]的长度不同。只是编译器在编译时没有捕捉到它。对不起。它起作用了。请试试,格弗特兰写的。如果我需要打印*,它会打印12341278。如果我使用标签10上的代码,非常感谢。我将尝试使用英特尔FORTRAN进行编译。可能它只适用于gfortran。恐怕我不能告诉您使用gfortran启用适当的运行时测试需要哪些选项,但这里还有其他人可能需要。我只使用了-Wall-Wno tabs-O3-ffast math-march=native-c,它工作正常。但是我很困惑为什么iaip:2真的有效?你已经打破了语言标准。因此,任何事情都可以发生,因为Fortran标准没有描述您所做的事情。这包括你认为有效的东西,或者正如第三次世界大战可以合法开始一样。对我来说,我从gfortran和Intel Fortran得到了不同的行为。不可能两者都是作品。现在我承认,我很惊讶两个编译器都没有检测到这个错误,至少我尝试了标记,对此我有些失望,但这并不能阻止您所描述的错误。@IanBush,我刚刚尝试了ifort 19.1,出现了希望出现的运行时错误。