Чтение выделяемых массивов из списков имен

Я использую GNU Fortran (GCC) 4.8.2

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

Это мой список имен: namelist.nml:

&SECTION_1
    intList = 5,6,7
&END

И это моя программа: namelist.f08:

program namelist
    implicit none

    integer, allocatable    :: intList(:)
    integer                 :: U    ! Unit to read the namelist file

    namelist /SECTION_1/ intList

    !allocate(intList(3)) ! <-- If I uncomment this, the program works.
    open(NEWUNIT=U, file="namelist.nml", status='OLD', recl=80, delim='APOSTROPHE')
    rewind(U)
    read(U, nml=SECTION_1)
    close(U)

    write (*,*) intList
end program namelist

Если я раскомментирую помеченную строку, программа будет работать, но, как я уже говорил, я не могу выделить ее, чтобы прочитать список имен. Кто-нибудь знает, как этого добиться?

2 ответа

Раздаются неофициальные предложения по автоматическому распределению при чтении будущих стандартов Фортрана. По крайней мере, чтобы символьные данные могли читать строки текста неизвестной длины https://github.com/j3-fortran/fortran_proposals/issues/9 . Существует актуальное предложение по автоматическому распределению дляIOMSGилиERRMSGспецификаторы в операторах ввода-вывода https://j3-fortran.org/doc/year/19/19-252.txt

Но ничего не закончено, AFAIK. В текущем Фортране нет автоматического решения.

Перед чтением необходимо выделить достаточно большой размер. Другого пути нет. Существуют и другие способы чтения данных, а также специальные форматы данных и специальные анализаторы. Списки имен — это еще не все, даже если зачастую они удобны.

Что ж, тем временем я нашел и реализовал два разных решения, которые, возможно, будут полезны другим.

  • Один из них — предварительно обработать список имен как текстовый файл, найти нужную переменную и подсчитать количество параметров. Я не читаю значения с помощью этой процедуры, а только подсчитываю значения, распределяю массивы и затем снова читаю файл, но на этот раз как стандартный список имен. Это решение близко к повторной реализации списков имен.
  • Другое решение — передавать значения не в виде списка чисел, а в виде строки, состоящей из списка чисел, разделенных запятыми. Эта строка позже обрабатывается, чтобы получить количество элементов и преобразовать их из строки в числа с плавающей запятой.
Другие вопросы по тегам