Данные блока FORTRAN, кажется, не работают

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

       BLOCK DATA filename
       PARAMETER (size=100)
       CHARACTER*8 somearray(size)
       COMMON /block1/ somearray

       DATA(somearray(i), i=100)/ 
      *'string1', 'string2', ... , 'string100'/

       END

В какой-то момент программы подпрограмма использует этот общий блок, как показано в приведенном ниже коде.

       SUBROUTINE SUB(array)

       IMPLICIT DOUBLE PRECISION (A-H,O-Z)
       CHARACTER*8 array(*), somearray(100)

       COMMON /block1/ somearray

       DO 100 I=1, iterations
       array(I)=somearray(I)
       ...
  100  CONTINUE
       END

Здесь somearray имеет пару пробелов в каждой строке вместо фактических значений, указанных в BLOCK DATA. Что может быть причиной этого?

Примечание: код скомпилирован с помощью Intel Fortran.


person iyiyy    schedule 01.07.2016    source источник
comment
Можете ли вы создать полный пример (как минимально воспроизводимый пример), чтобы мы могли его посмотреть?   -  person francescalus    schedule 01.07.2016


Ответы (1)


Я нашел решение этой проблемы, добавив оператор SAVE перед оператором END любого BLOCK DATA, как показано ниже.

   BLOCK DATA filename
   PARAMETER (size=100)
   CHARACTER*8 somearray(size)
   COMMON /block1/ somearray

   DATA(somearray(i), i=100)/ 
  *'string1', 'string2', ... , 'string100'/
   SAVE
   END
person iyiyy    schedule 13.10.2017
comment
вы должны улучшить этот ответ, показав пример. Блоки common не имеют конечных операторов, поэтому другим, вероятно, будет непонятно, что вы имеете в виду. - person agentp; 13.10.2017
comment
Во-вторых, было бы хорошо показать ваши полные модификации. Однако я также отмечу, что если вы используете save в данных блока, это работает, если общий блок имеет атрибут сохранения. Если вы сделаете это, вы должны явно указать этот атрибут для общего блока в каждой области, в которой он встречается. Наконец, если это работает, то это из-за того, что общий блок становится неактивным: если бы в вопросе был приведен полный пример, мы могли бы решить это 15 месяцев назад. - person francescalus; 13.10.2017
comment
@francescalus: я понимаю, однако полный пример был невозможен, учитывая размер и тесную связь программы. Не помогло и незнание FORTRAN. @agentp: Если вы посмотрите на первый предоставленный мной пример кода, я добавил оператор save перед оператором end. Тогда это block data, к которому относится save? - person iyiyy; 13.10.2017
comment
программная единица block data и общий блок - это разные вещи. Вот почему ваш ответ неясен, и показ реального примера поможет. В любом случае эта проблема возникает из-за того, что многие компиляторы автоматически сохраняют все в общих блоках, до такой степени, что многие программисты никогда не беспокоились о явных операторах save. - person agentp; 13.10.2017
comment
@agentp: Спасибо за уточнение и добавление информации о компиляторах. Я отредактировал ответ, дайте мне знать, если теперь он понятнее. - person iyiyy; 13.10.2017