Какой вид массива Integer создается этим форматом? - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в Фортране и мне нужно работать с кодом для чтения и записи данных.Код немного старше, и мне нужно понять, как все происходит внутри;)

Код читает строку файла .dat с

FORMAT(36A2): 
READ(11,FORMAT(36A2)) ITEXT

Переменная ITEXT объявлена ​​какцелочисленный массив: INTEGER (KIND = 2), DIMENSION (36) :: ITEXT

Так что, если я прочитаю в следующей строке:

          SREF   = 0.031416,
ITEXT hast the following value:
2313   8224  21075  17989   8224  15648  12320  12334  12595  12596  11318   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224   8224

Если я сделаю WRITE(11,FORMAT(36A2)), это дастмне обратно мой полный текст.SREF = 0.031416,

Так что же это за «Целочисленный код»?Как я могу работать с этим и почему я должен использовать это?

Это совершенно новый для меня.

В следующей части приведен пример кода.Целое число "21075" представляет собой "SR" из "SREF = 0.031416"

program example

    integer :: ITEXT = 21075

    WRITE (*,100), ITEXT
100 FORMAT(36A2)

end program example

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Код представляет собой действительно старый стиль Fortran. Символы строки кодируются как десятичные значения таблицы ASCII в целочисленные элементы массива itext. Когда код считывает символьную строку в формате А2, два символа ввода из файла сохраняются в каждом элементе массива. Числовое значение, которое приводит к любому элементу, будет:

ASCII_1*2**8 + ASCII_2

где ASCII_1 и ASCII_2 - это две десятичные записи символов в таблице ASCII.

Поскольку первые два символа - '' (пробелы) со значением ASCII 32, вы получите 32 * 2 ** 8 + 32 = 8224

Попробуйте свою программу с этим

program bla
integer(KIND=1), DIMENSION(72) :: itext
open(11,file='bla.dat',status='old')
read(11,'(72a1)') itext
write(*,'(72a1)') itext
write(*,'(72(i4,2x))') itext
close(11)
end program bla

затем вы получите строку чисел, таких как 32 для '', 83 для 'S' и т. Д.

0 голосов
/ 21 июня 2019

В исходном Фортране не было типов данных персонажа.Данные Chracter должны были храниться в целых числах.Строки символов можно хранить там, используя устаревшие константы Холлерита

  ITEXT = 2HSR

. Здесь хранятся два символа "SR" в ITEXT.Теперь лучший способ - использовать read для хранения там

  WRITE(ITEXT,'(A2)') "SR"

или

  WRITE(ITEXT,'("SR")')

Сам формат

100 FORMAT(36A2)

- это обычный строковый ввод/Выходной формат.Он выводит 36 строк длины два.Обычно он применяется к строковым данным, но может применяться и к другим типам данных, если в них хранятся символьные данные.Если числовые типы данных на самом деле содержат числовые данные, вывод из символьного формата будет мусором.

Имейте в виду, что литеральная константа 2 в (KIND=2) не является переносимой и не гарантированно подходит дляхранить два символа (в отличие от нестандартного INTEGER*2).См. Фортран: целое число * 4 против целого числа (4) против целого числа (вид = 4)

...