Почему обычные блочные переменные не сохраняют свои значения?
Во-первых, я знаю, что использование общих блоков - плохая идея на фортране (и программировании в целом). Однако я обновляю чужой код и не хочу портить вещи, которые, как известно, работают.
Во-вторых, я знаю, что я должен опубликовать что-то более конкретное, чем это. Если бы я знал, как превратить это во что-то маленькое, я бы так и сделал. Однако, поскольку я знаю и не думаю, что вы оцените 2500 строк кода, я не могу опубликовать конкретный пример.
Имея это в виду, я не могу описать свою проблему.
Я обновляю чужой код Фортрана. Парень использовал несколько (4) общих блоков для установки глобальных переменных. По какой-то причине, когда я вызываю функцию, которая использует такой блок, все его значение равно 0. Кто-нибудь сталкивался с этим раньше? Кто-нибудь знает, почему это может произойти? Как воспроизвести это? Любая отправная точка, чтобы проверить это было бы полезно.
Для чего это стоит, упомянутый общий блок объявлен как
common /set/ block,x,y,z,llx,lly,llz,ilx,ily,ilz,third,third2
block
4D массив x
, y
, а также z
1D массив. llx
,lly
, а также llz
, являются double precision
типы. Остальные integer
типы.
Общий блок (и) объявляется и инициализируется в основной программе перед вызовом любой функции.
2 ответа
Некоторые компиляторы инициализируют общие переменные нулями, поэтому, если вы сначала вызовете функцию с общим блоком, вы можете найти нули везде (хотя вам не следует полагаться на это). Но как только вы установите некоторые значения для общих переменных блока в программе, эти значения должны появляться всякий раз, когда вы используете общий блок.
Что касается переменных в общем блоке: они могут быть произвольного типа, если они последовательно определены во всех местах, где используется общий блок.
Можете ли вы сравнить свой код с этим крошечным примером? Я думаю, вы можете что-то упустить, например, "общее" объявление внутри подпрограммы.
Обратите внимание, что вам не нужно использовать одно и то же имя для переменной внутри подпрограммы (AA
) как у вас для основного (GB
). Просто общее название блока (myarray
) должен быть таким же. Однако ничего плохого не произойдет, если вы замените AA
от GB
и конечный результат будет немного чище читать.
program main
real GB(4)
common /myarray/ GB
integer i
real B(4)
GB=0
write(*,*) 'GB',GB
do i=1,4
call AddSubR()
write(*,*) 'GB',GB
enddo
end program main
subroutine AddSubR()
real AA(4)
common /myarray/ AA
integer i
do i=1,4
AA(i) = AA(i)+1
enddo
end subroutine AddSubR