2010-12-14 4 views
-1

Так странно. Требуется ли FORTRAN переименовывать переменные после их отправки в качестве параметров? Я продолжал получать ошибку сегментации всякий раз, когда я отправлял те же аргументы в другую подпрограмму. Я обнаружил, что значения аргументов были протерты между первым вызовом и вторым, без инструкций переопределения аргументов между вызовами функций или даже в любой из функций. Объем этих аргументов ограничен основной программой (я не использую никаких COMMON блоков).FORTRAN стирает значения arg между вызовами функций?

Я не могу отправить код прямо сейчас, поскольку я пишу с телефона, но любые идеи? Временным решением является переназначение значений непосредственно перед вызовом второй функции.

Спасибо за помощь.

+0

нет кода, нет удовольствия. –

+0

Я согласен с Стефано, нельзя быть уверенным, что происходит, не видя кода. Вы указываете намерение своих аргументов? (Вы должны быть.) Когда вы пишете, что область аргументов ограничена основной программой, но что вы передаете эти переменные в качестве аргументов подпрограмм, вы меня сбиваете с толку - если вы передаете аргумент подполе -программа расширяется, хотя может показаться, что оно имеет другое название. –

+0

Согласовано. Объем расширен. Объедините это с вызовом по ссылке и пропущенным изменением значения в подпрограмме, и у вас есть рецепт segfault. –

ответ

4

Fortran передает аргументы по ссылке, поэтому, если вы изменяете их в первой подпрограмме, они будут изменены в вызывающем.

+0

Я не думал, что я изменял их в подпрограммах, но при ближайшем рассмотрении обнаружил, что я был. Спасибо за помощь. –

+0

Если вы можете, указание 'намерение (in)' как часть объявления переменной в функции может помочь компилятору проверить, случайно ли вы присваиваете то, что вам не нужно. –

3

Нет Фортран не изменяет переменные, если они использовались в качестве аргументов в вызове подпрограммы.

Однако аргументы, переданные посредством ссылки, могут изменять свои значения вызываемой подпрограммой.

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

Только мой ¤0.02 стоит - это десятилетия с тех пор, как я посмотрел на Фортрана (IV).

+0

Я не знаю почему, но каждый раз, когда я читаю «Фортран-четыре», я помню «Number Nine» (Pink Floyd). Кстати, я до сих пор помню загрузку программ FIV с перфокарт. –

+0

У меня все еще есть перфокарты с 80 колонками IBM с Fortran IV на них (если книжные черви не уменьшили их до пыли) - эскиз Monty Python Yorkshireman. – RedGrittyBrick

+0

Действительно, это ссылка, как отметил также @lijie. Я забыл, что на самом деле они были изменены. Спасибо всем за ваши усилия! –