Общие переменные общего блока

Скажем, у меня есть две подпрограммы

  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?


person Siddy Sid    schedule 12.04.2016    source источник


Ответы (2)


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

Следующая программа

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
person Feffe    schedule 12.04.2016

Это совместное использование действительно является точкой общих блоков. В частности, оператор 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, скажем, в одной подпрограмме.

И последнее, что я хочу сказать: есть намного лучшие способы обмена данными "глобально" без общих блоков.

person francescalus    schedule 12.04.2016