Почему обычные блочные переменные не сохраняют свои значения?

Во-первых, я знаю, что использование общих блоков - плохая идея на фортране (и программировании в целом). Однако я обновляю чужой код и не хочу портить вещи, которые, как известно, работают.
Во-вторых, я знаю, что я должен опубликовать что-то более конкретное, чем это. Если бы я знал, как превратить это во что-то маленькое, я бы так и сделал. Однако, поскольку я знаю и не думаю, что вы оцените 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
Другие вопросы по тегам