Ну, вы определили SMALL
как одномерный массив, и Фортран просто пытается помочь. Возможно, вы должны были определить SMALL
как это;
integer, dimension(2,5) :: small
То, что произошло, когда был выполнен оператор read
, заключался в том, что система исчерпала дескриптор редактирования (вы указали 5 целых чисел) до того, как либо SMALL
был заполнен, либо обнаружен конец файла. Если я правильно помню, Fortran будет повторно использовать дескриптор редактирования до тех пор, пока либо SMALL
не заполнится, либо будет достигнут конец файла. Но это поведение менялось с годами, в соответствии со стандартами Fortran, и различные компиляторы реализовали различные нестандартные функции в этой части языка, поэтому вам может потребоваться проверить документацию вашего компилятора или провести еще несколько экспериментов, чтобы точно определить, что происходит.
Я думаю, что ваш код также немного своеобразен тем, что вы читаете из SMALL
3 раза. Почему?
РЕДАКТИРОВАТЬ: ОК, мы там. Вы только что обнаружили, что Fortran хранит массивы в порядке столбцов. Я считаю, что большинство других языков программирования хранят их в порядке следования строк. Другими словами, первый элемент вашего массива - small(1,1)
, второй (в памяти) - small(2,1)
, третий - small(1,2)
и т. Д. Я думаю, что ваши операторы чтения (и записи) не являются стандартными, но широко применяются (что не является чем-то необычным в компиляторах Фортрана). Я могу ошибаться, это может быть стандартным. В любом случае, оператор read
интерпретируется для чтения элементов small
в мажорном столбце. Первое прочитанное число вводится в small(1,1)
, второе в small(2,1)
, третье в small(1,2)
и т. Д.
Ваш оператор write
использует ту же функцию; Вы могли бы открыть это для себя, если бы вы записали элементы в циклы с напечатанными индексами.
Идиоматический способ чтения массива на Фортране и управления порядком, в котором элементы помещаются в массив, заключается в том, чтобы включить в оператор чтения цикл implied-do , например:
READ(UNIT=10, FMT='(5I4)', iostat=reason) ((SMALL(row,col), col = 1,numCol), row=1,numRow)
Вы также можете использовать этот подход в write
выражениях.
Вам также следует внимательно изучить документацию компилятора и определить, как включать предупреждения для всех нестандартных функций.