Что на самом деле происходит в памяти в общих блоках FORTRAN? - PullRequest
2 голосов
/ 24 марта 2020

Я вхожу в Фортран с тяжелым C фоном. Это все довольно просто, за исключением фактических механизмов того, как COMMON блоки работают, сбивает меня с толку, и я не могу найти место, которое описывает их подробно.

Допустим, у меня есть следующий блок COMMON в FORTRAN .

COMMON/MYBLOCK/ A,B,C

Насколько я понимаю, это отведет часть памяти, которая содержит три ... вещи, которые на самом деле не связаны с именами в блоке, и фактически если If имеют этот следующий код позже в моем источнике:

SUBROUTINE MYSUB(...)
...
COMMON/MYBLOCK/ X,Y,Z
...
END 

Тогда теперь X связан с тем, что раньше было в A, и теми же Y с B и Z с C.

Так это значит COMMON/MYBLOCK/ это ... массив пустых указателей, когда он объявлен? Нет никакого типа, связанного с каким-либо из этих указателей, так что ... память выделяется при назначении значения? Что произойдет, если я скажу A='A' в моей основной теме, но затем в MYSUB я скажу A=3.141592? Если у меня есть подпрограмма, по которой я хочу вернуть значение в A по ссылке (потому что это часть внешней библиотеки), могу ли я просто сказать CALL MYSUB2(A) и рассчитывать на компилятор, чтобы разобраться с этим? Или мне нужно сначала вызвать MYSUB2 для локальной переменной, а затем присвоить ее A?

Это странно, FORTRAN такой строгий типизированный язык везде, но блоки COMMON такие же, как "делай, что хочешь, чувак, мы здесь не пишем" ...

1 Ответ

3 голосов
/ 24 марта 2020

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

Общие блоки - это место для хранения c хранилище , к которому можно получить доступ из различных модулей компиляции . Доступ к хранящимся там переменным осуществляется с использованием общего имени блока и положения (смещения) переменной внутри общего блока.

Это не для типа наказания. Нельзя ссылаться на одну и ту же ячейку памяти как разные типы. К нему всегда нужно обращаться как к одному типу. Вы можете использовать ту же ячейку памяти, что и разные типы, только если вы разделите использование. Вы не можете написать вещественное и прочитать целое число.

Переменные, хранящиеся в общих блоках, безусловно, имеют тип. Тип может быть объявлен явно или определен с использованием правил неявной типизации.

 IMPLICIT NONE

 COMMON /BLOCK1/ A, B, C

 END

даст вам

> gfortran common.f90 
common.f90:3:18:

  COMMON /BLOCK1/ A, B, C
                  1
Error: Symbol ‘a’ at (1) has no IMPLICIT type
common.f90:3:21:

  COMMON /BLOCK1/ A, B, C
                     1
Error: Symbol ‘b’ at (1) has no IMPLICIT type
common.f90:3:24:

  COMMON /BLOCK1/ A, B, C
                        1
Error: Symbol ‘c’ at (1) has no IMPLICIT type

, и вам придется объявить тип переменных явно .

Не видя ничего из вашего кода, мы должны сделать вывод, что ваши переменные имеют тип real по правилам неявной типизации, если только явное выражение IMPLICIT не налагает другие правила неявной типизации.

...