Фортран заявление о возврате - PullRequest
3 голосов
/ 09 июля 2010

Я пытаюсь получить некоторый код, скомпилированный в gfortran, который прекрасно компилируется в g77.Кажется, проблема в операторе возврата:

ffuncs.f: 934.13:

  RETURN E
         1

Ошибка: для альтернативного оператора RETURN в (1) требуется спецификатор возврата SCALAR-INTEGER

В коде что-либо E было задано как действительное * 8:

ПОДРАЗУМЕВАЕМЫЕ РЕАЛЬНЫЕ * 8 (A - H, O -Z)

Однако E никогда не давалось значение или что-либона самом деле вы никогда не увидите его, пока не получите ответное заявление.Я почти ничего не знаю о Фортране.Что означает выражение return с аргументом в фортране?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 09 июля 2010

В FORTRAN (до Fortran 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 звучит неправильномне.Если нет синтаксиса, о котором я не знаю, предыдущий компилятор должен был пометить это как ошибку.

2 голосов
/ 09 июля 2010

Я думаю, у @Carl Smotricz есть ответ.Имеет ли список аргументов ffuncs фиктивные аргументы, которые являются звездочками (чтобы соответствовать метке звездочки в вызовах)?Или это было использовано без альтернативных возвратов?Если альтернативных возвратов не было, просто удалите «E».Если есть альтернативные возвраты, большой вопрос в том, что программа делала раньше во время выполнения, так как переменная была неправильного типа и неинициализирована.Если переменная не имеет целочисленного значения, совпадающего с одной из ожидаемых ветвей, возможно, программа взяла обычную ветвь возврата - но это только предположение - если так, то простым решением будет снова удалить «E».

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

2 голосов
/ 09 июля 2010

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

...