Обе версии оператора с пометкой 10
и 11
неверны.
Секция массива ia(5:2)
является секцией массива, состоящей из нулевых элементов массива ia
. Секция массива ia(IP:2)
(когда IP
является переменной со значением 5
) одинакова.
При использовании литеральной константы в индексах элементов массива ваш компилятор знает, что при компиляции он может проверять совпадение формы левой и правой частей. Ваш компилятор здесь определил, что ia(5:2)
имеет форму [0]
, а [11, 12]
имеет несовместимую форму [2]
. Поэтому он сообщает об ошибке.
Ваш компилятор не обнаруживает во время компиляции ошибку с непостоянными подписками в ia(IP:2)
. Код, однако, нарушает стандарт Фортрана точно так же. На первый взгляд правильный вывод: плохо удача.
Ваш компилятор может не обнаруживать ошибку во время выполнения либо из-за опций, которые вы использовали для компиляции, либо из-за того, что он (правильно) не применяет тест формы.
Другие компиляторы вполне могут жаловаться, например, с сообщением:
Rank 1 of constant array operand has extent 2 instead of 0
Program terminated by fatal error
Abort (core dumped)
С заявлением
print *, IA(IP:2)
это «работает» (в противном случае правильно сформированная программа). Однако оно страдает от того же недоразумения, что и раньше.
Этот оператор печати печатает нулевые элементы массива ia
в отличие от двух элементов ia(5:6)
. Вместо того, чтобы «не работать», отсутствие очевидного вывода означает правильную печать ничего / пустую строку.
В заключение, ia(5:2)
не является ссылкой на два элемента после и включая ia(5)
. Для этого вам понадобится ia(5:6)
или ia(ip:ip+1)
. Индексы - это границы, а не границы и количество.