Фортран прочитал последовательность чтения оператора - PullRequest
3 голосов
/ 21 апреля 2019

Предположим, у меня есть файл, в котором каждая строка содержит индекс массива, за которым следует значение массива

i  array(i)

Могу ли я прочитать данные просто наивным read(unit=10, *) i, array(i)?Будет ли Fortran всегда сначала читать i, а затем использовать это значение i для присвоения array(i)?Будут ли определенные read спецификации или флаги компилятора влиять на поведение?

1 Ответ

3 голосов
/ 21 апреля 2019

оператор передачи данных

read(unit=10,*) i, array(i)

является допустимым, и его поведение соответствует желаемому: из записи сначала читается значение i, затем это значение используется для идентификации элемента массива array(i) для второго считанного значения.

Это требование спецификации Fortran, например, с (Fortran 2018, 12.6.4.5.1):

Все значения, необходимые для определения того, какие объекты заданы элементом списка ввода / вывода, определяются в начале обработки этого элемента.

Конечно, хотя этот оператор переноса данных потенциально работает, это не значит, что он желателен во всех случаях, кроме простейших случаев, когда вы доверяете входным данным. В частности, невозможно выполнить какую-либо проверку границ во время этого оператора чтения. Если считанное значение i соответствует неверной спецификации элемента массива, программа не работает. Возможно, вы захотите использовать промежуточное значение для элемента массива просто для решения потенциальных проблем с входным файлом.

...