fortran77: массивы указателей или массивы структур?

Я пытаюсь оптимизировать код в fortran77, и я хотел бы знать, являются ли массивы, объявленные следующим образом внутри подпрограммы или файла заголовка, массивами указателей или массивами структур:

случай 1: реальный * 8 x красный (макс. атм.)

случай 2: общий /атомы/ x(maxatm)

Я уже искал в Интернете, но не смог найти никакой информации об этом, единственное, что я нашел, это то, что когда вы передаете массив в подпрограмму, он передается по ссылке. Но относительно того, когда он объявлен в заголовочном файле или внутри процедуры, я ничего не нашел.

Заранее спасибо!


person dx_mrt    schedule 07.03.2012    source источник
comment
Я не понимаю вашего вопроса. Во-первых, стандартный fortran 77 не имеет концепции файлов заголовков, поэтому, пожалуйста, объясните, что именно вы подразумеваете под ними. Также f77 не имеет указателей или структур. Что касается того, что вы нашли при передаче по ссылке: стандарт вообще ничего не говорит об этом, поэтому, хотя это, вероятно, самый распространенный способ, он все же зависит от реализации.   -  person eriktous    schedule 08.03.2012
comment
Он просто спрашивает, что происходит «под капотом». Файлы заголовков в F77 являются файлами include/COMMON (.CMN и т. д.), они играют в основном ту же роль, что и заголовки .h в C (хотя реализованы немного по-другому). F77 имеет POINTERs в структуре. Из спецификации: каждый указатель содержит адрес своей парной переменной. Переменная на основе указателя — это переменная, соединенная с указателем в операторе POINTER. Переменная на основе указателя обычно называется просто переменной на основе. Указатель — это целочисленная переменная, содержащая адрес.   -  person MoonKnight    schedule 08.03.2012
comment
Более того, я думаю, что под структурой и указателем в вопросе подразумевается то, что делает компилятор F77 для управления памятью. Стандарт ясен, все значения, передаваемые в SUBROUTINEs и FUNCTIONs, являются по ссылке не значением. Кроме того, да, в F77 есть STRUCTURE в зависимости от выбора компилятора.   -  person MoonKnight    schedule 08.03.2012
comment
@Killercam: Если это то, о чем спрашивают, это должно быть в вопросе. Я знаю об утверждении include, но формулировка вопроса предполагает, что переменные объявляются внутри «файлов заголовков», хотя на самом деле это не более чем текстовая замена перед собственно компиляцией, поэтому любое объявление фактически находится внутри обычного программного модуля. Текст, который вы цитируете по указателям, не соответствует стандарту f77, и нигде в стандарте явно не упоминается передача по ссылке или значению. Поскольку все это зависит от реализации, в вопросе следует указать, какой компилятор используется.   -  person eriktous    schedule 08.03.2012


Ответы (1)


В файле 'header'/common/.CMN .f77 вы объявляете свои переменные, которые будут использоваться в вашей программе. Пространство, необходимое для этих переменных, устанавливается во время компиляции для каждого файла, содержащего объявление заголовка. Итак, для «My.CMN», который содержит

REAL*8 XEDG(-2:MAXNB+4)  ! left x-edges of cells    
REAL*8 YEDG(-2:MAXNB+4)  ! left y-edges of cells 
REAL*8 XC(-2:MAXNB+4) ! X CELL CENTERS
REAL*8 YC(-2:MAXNB+4) ! Y CELL CENTERS

Эти переменные создаются каждый раз, когда они объявляются в файле .f77 через INCLUDE 'My.CMN'.

Однако с помощью общего блока

COMMON /GRID/ XEDG,YEDG,XC,YC

сообщает компилятору, что переменные, содержащиеся в данном файле .CMN (или любом другом), являются в некоторой степени глобальными/общими, здесь компилятор будет использовать указатели на соответствующее пространство в памяти.

The COMMON statement defines a block of main memory storage so that 
different program units can share the same data without using arguments.

См. здесь для получения дополнительной информации о COMMON и здесь для Справочного руководства по компилятору Sun FORTRAN 77 4.0.

person MoonKnight    schedule 07.03.2012