ОБЩИЙ блок общих переменных

Допустим, у меня есть две подпрограммы

  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
Другие вопросы по тегам