ОБЩИЙ блок общих переменных
Допустим, у меня есть две подпрограммы
SUBROUTINE S2909
COMMON X,Y
X =2;
Y =3;
END
SUBROUTINE S2900
COMMON X,Y
//display X and Y
END
Блок COMMON используется для совместного использования переменных, значит ли это, если значение X
, Y
что обновляется в подпрограмме S2909
будет так же, как в подпрограмме S2900
?
2 ответа
Это разделение действительно является точкой общих блоков. В частности, common
оператор позволяет так называемую ассоциацию хранения между различными объектами в рамках программы.
Итак, сущности X
а также Y
в подпрограмме S2909
хранилище связано с сущностями X
а также Y
в подпрограмме S2900
, Изменения стоимости в одной сущности X
отражены другим лицом X
,
Есть несколько вещей, на которые стоит обратить внимание.
в common
формулировки вопроса это полагается на то, что известно как пустое общее. Это то, что происходит, когда для общего блока не указано имя, например, в операторе
common /named/ x, y
Это примечательно, потому что попытка обобщить поведение в этом вопросе для именованных общих блоков может быть проблематичной.
Объекты в разных местах, на которые ссылаются общие блоки, связаны не по имени, а по порядку в последовательности хранения. Это означает, что нужно проявлять осторожность, скажем,
SUBROUTINE S2909
COMMON X,Y
END
SUBROUTINE S2900
COMMON Y,X
END
Но мой ответ на самом деле имеет два момента, и вышеприведенная просто преамбула, чтобы сделать его более похожим на ответ.
Во-первых, я упомяну патологический случай, который я не ожидал увидеть в дикой природе.
Вопрос основан на неявной типизации. Рассмотрим следующее
subroutine S2909
common x, y
x = 2.
y = 3.
end subroutine S2909
implicit integer (a-z)
call S2909
call S2900
contains
subroutine S2900
common x, y
print*, x, y
end subroutine
end
Это пример нецивилизованного написания кода, но он иллюстрирует важную вещь. Потому что сущности x
в S2909
а также x
в подпрограмме S2900
разных типов, определяющих один из них, заставляет другой становиться неопределенным. То есть: обновление значения одного не обновляет значение другого. При явной типизации можно увидеть то же самое, или если бы была неявная типизация с правилами и сущностями по умолчанию i
а также j
скажем, в одной подпрограмме.
И последнее, что я хочу сказать: есть гораздо лучшие способы обмена данными "глобально" без общих блоков.
Насколько я понимаю, да, переменные являются общими для всей программы. Их значения будут зависеть от порядка вызова подпрограмм.
Следующая программа
program test
real x,y
common x,y
x = 1
y = 2
write(*,*) x,y
call changevals
write(*,*) x,y
end program test
subroutine changevals
real x,y
common x,y
x = 12
y = 13
end subroutine changevals
выходы
1.00000 2.00000
12.00000 13.00000