Фортран заявление

Я пытаюсь получить некоторый код, скомпилированный под 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".

Функция "альтернативный возврат" считается языковой нормой "устаревшей" и может быть удалена в будущем стандарте; компиляторы, вероятно, продолжат поддерживать его, если он будет удален из-за устаревшего кода. Для нового кода одной простой альтернативой является возвращение целочисленной переменной состояния и использование оператора "выбор регистра" в вызывающей программе.

В функции Фортрана вы возвращаете значение, присваивая значение фиктивной переменной, имя которой совпадает с именем функции. Как только вы это сделаете, просто вернитесь.

Другие вопросы по тегам