Значение не передается подпрограмме с использованием общего блока - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь передать параметр между основной программой Fortran и подпрограммой.Однако по какой-то причине в подпрограмме получается другое значение.Я использую общие блоки.

program main
nzcur=1
write(*.*)"nzcur in main",nzcur

call hit

subroutine hit
common/part/nzcur
write(*,*)"nzcur in hit",nzcur; pause
end

end program

Я ожидаю nzcur=1, но получаю nzcur=0.

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

1 Ответ

0 голосов
/ 19 июня 2019

Как отмечено в комментариях, правильный ответ на этот вопрос при обучении состоит в том, чтобы избегать использования общих блоков для доступа к переменным из других областей.При написании кода в современную эпоху есть гораздо лучшие способы (более поздние).

К счастью, мы можем взглянуть на этот вопрос с точки зрения «как я понимаю, что происходит с этим общим блоком?»,Такой вопрос полезен тем неудачливым программистам, которые пытаются понять старый (или плохо написанный новый) код.

При рассмотрении программы вопроса следует учитывать, что для получения скомпилируемого кода требуется несколько исправлений (с различными возможнымиподходы).Ошибки там не имеют прямого отношения к обсуждению.

В подпрограмме

subroutine hit
common/part/nzcur
write(*,*)"nzcur in hit",nzcur; pause
end

у нас есть именованный общий блок с именем part, с одним числовым блоком хранения, который содержит целочисленную переменнуюnzcur (благодаря неявной типизации).

В этом вопросе очевидно, что переменная nzcur в этом общем блоке обращается к некоторой другой переменной, называемой nzcur, и что эта другая переменнаяв основной программе под названием nzcur.Это неверно.

nzcur в подпрограмме связан только с первым числовым блоком хранения любого другого общего блока с именем part.Ассоциация не основана на названии или местоположении в определении общего блока.

В программе вопроса нет другого общего блока с именем part;nzcur подпрограммы не связано ни с чем другим.Конечно, она не связана с переменной, не входящей в общий блок.

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

Чтобы «исправить» связь, необходимо будет поместить переменную nzcurОсновная программа находится в правильном месте в общем блоке с именем part (в основной программе).


Чтобы ответить на вопрос «как мне установить значение nzcur в подпрограмме безиспользуя общие блоки? ", обратитесь к другим вопросам, таким как this .

...