Эта проблема может быть проще, если она предназначена для использования массива структур, а не структуры массивов.Подход к структуре массивов выглядит примерно так:
program nml1
implicit none
type info(length)
integer, len :: length
character(20) name(length)
integer age(length)
character(20) country(length)
end type info
type(info(:)), allocatable :: class
namelist /my_data/ class
class = info(3)([character(20)::'a','b','c'],[12,13,14], &
[character(20)::'china','chile','india'])
write(*,nml=my_data)
end program nml1
Или, может быть,
program nml2
implicit none
type info(length)
integer, len :: length
character(20) name(length)
integer age(length)
character(20) country(length)
end type info
type(info(:)), allocatable :: class
namelist /my_data/ class
allocate(info(3)::class)
class%name = [character(20)::'a','b','c']
class%age = [12,13,14]
class%country = [character(20)::'china','chile','india']
write(*,nml=my_data)
end program nml2
Но я не могу заставить их скомпилироваться с gfortran или ifort.Моя ошибка или ошибки компилятора?
Но это не большая проблема, потому что я все равно рекомендую подход с массивом структур.В этом случае вместо 3-х массивов скалярных данных, упакованных в структуру (или просто бесплатно), мы упаковываем все соответствующие данные для каждого учащегося в структуру и создаем массив таких структур.Вот как это выглядит:
program nml
implicit none
type info
character(20) name
integer age
character(20) country
end type info
type(info), allocatable :: class(:)
namelist /my_data/ class
class = [info('a',12,'china'),info('b',13,'chile'),info('c',14,'india')]
write(*,nml=my_data)
end program nml
Теперь, что хорошо в этом подходе, это то, что он не только компилируется, но и данные автоматически регургитируются в правильном порядке и с метками через `namelist './ O, так что если этот формат достаточно хорош, нам не нужно писать какой-либо причудливый код вывода.Выход с гфортраном составляет:
&MY_DATA
CLASS(1)%NAME="a ",
CLASS(1)%AGE=12 ,
CLASS(1)%COUNTRY="china ",
CLASS(2)%NAME="b ",
CLASS(2)%AGE=13 ,
CLASS(2)%COUNTRY="chile ",
CLASS(3)%NAME="c ",
CLASS(3)%AGE=14 ,
CLASS(3)%COUNTRY="india ",
/