Фортран заявление
Я пытаюсь получить некоторый код, скомпилированный под gfortran, который прекрасно компилируется под g77. Проблема, кажется, из заявления возврата:
ffuncs.f: 934,13:
RETURN E
1
Ошибка: для альтернативного оператора RETURN в (1) требуется спецификатор возврата SCALAR-INTEGER
В коде все E было указано как действительное *8:
НЕЗАКОННОЕ РЕАЛЬНОЕ *8 ( A - H, O -Z)
Тем не менее, E никогда не давали значение или что-то еще, на самом деле вы никогда не увидите его до оператора return. Я почти ничего не знаю о Фортране. Что означает возвращаемое утверждение с аргументом в фортране?
Благодарю.
3 ответа
В Фортране (до Фортрана 77, с которым я очень хорошо знаком), RETURN n
не используется для возврата значения функции; вместо этого он делает что-то вроде того, что в других языках будет обрабатываться исключением: выход в другое место кода, отличное от нормального.
Вы бы обычно назвали такой SUBROUTINE
или же FUNCTION
с метками в качестве аргументов, например
CALL MYSUB(A, B, C, *998, *999)
...
998 STOP 'Error 1'
998 STOP 'Error 2'
и если что-то пойдет не так в MYSUB, то вы делаете RETURN 1
или же RETURN 2
(вместо обычного ВОЗВРАТА), и вы будете прыгать прямо к метке 998 или 999 в процедуре вызова.
Вот почему обычно вы хотите получить целое число в этом RETURN - это не значение, а индекс, к которому вы хотите обратиться при выходе из ошибки.
RETURN E
звучит неправильно для меня. Если нет синтаксиса, о котором я не знаю, предыдущий компилятор должен был пометить это как ошибку.
Я думаю, что у @Carl Smotricz есть ответ. Имеет ли список аргументов ffuncs фиктивные аргументы, которые являются звездочками (для соответствия метке звездочки в вызовах)? Или это было использовано без альтернативных возвратов? Если не было альтернативных возвратов, просто удалите "E". Если есть альтернативные возвраты, большой вопрос в том, что программа делала раньше во время выполнения, так как переменная была неправильного типа и неинициализирована. Если переменная не имеет целочисленного значения, совпадающего с одной из ожидаемых ветвей, возможно, программа взяла обычную ветвь возврата - но это всего лишь предположение - если это так, то простым решением будет снова удалить "E".
Функция "альтернативный возврат" считается языковой нормой "устаревшей" и может быть удалена в будущем стандарте; компиляторы, вероятно, продолжат поддерживать его, если он будет удален из-за устаревшего кода. Для нового кода одной простой альтернативой является возвращение целочисленной переменной состояния и использование оператора "выбор регистра" в вызывающей программе.
В функции Фортрана вы возвращаете значение, присваивая значение фиктивной переменной, имя которой совпадает с именем функции. Как только вы это сделаете, просто вернитесь.