Дата публикации: Dec 15, 2012 11:56:24 AM
Старые диалекты Фортрана активно использовали концепцию меток - натуральных чисел, однозначно идентифицирующих строки программы. В современном Фортране метки тоже находят свое применение, хотя их роль в принципе меньше при следовании структурному стилю.
Раньше метки использовались для безусловных переходов GOTO - это обычное дело, но был и вычисляемый GOTO, передававший управление на одну из меток в зависимости от значения выражения. Существовал арифметический условный оператор, передававший управление на одну из трех меток в зависимости от знака значения некоторого выражения. Метку можно было вычислить, как целочисленное выражение. Метка обозначала конец тела цикла, причем, возможно, и нескольких вложенных. Наконец, процедура могла передать управление не на точку, следующую за ее вызовом, а на одну из переданных в качестве параметра меток. Всем этим средствам, прогрессивным в свое время, ныне есть более адекватные структурные замены и они официально удалены из стандарта или объявлены устаревшими.
Однако метки занимают несколько ниш,в которых вполне адекватны и сегодня.
Метка идентифицирует строку формата, содержащую оператор FORMAT. Это удобно, поскольку позволяет собрать все сложные форматы вместе в конце либо начале программы и обращаться к ним по мере необходимости, причем описание формата может испльзоваться многократно. Есть возможность записать строки формата в символьные переменные, но тогда они вынужденно будут в области определений. Впрочем, это дело вкуса.
Метки указывают строку, на которую следует перейти в случае возникновения исключительных ситуаций при вводе и выводе: при возникновении ошибки (спецификатор ERR), при обнаружении конца файла (END) или конца записи (EOR).
Оператор GOTO (допустимо GO TO) противоречит структурному стилю, но иногда используется. Например, он удобен, чтобы перепрыгнуть через ситуацию обработки исключительной ситуации при вводе (что-то вроде:
READ(S,*, ERR = 1) N ! читать целое N из строки S с форматированием по умолчанию, переход на метку 1 в случае ошибки.
GO TO 2
1 ... ! обработка ошибки ввода)
2 CONTINUE ! ничего не делает
...
При этом обработка ошибки происходит, только если оператор чтения осуществит переход на метку 1).
Или для пропуска блоков кода при отладке. Также может использоваться для выхода из глубоко вложенного цикла в случае маловероятного события (хотя лучше использовать EXIT с именем конструкции). Наконец, уместно прыгать к единственной точке выхода из процедуры вместо разбросанных по телу большой процедуры операторов RETURN.