在fortran中打印两个1维数组

时间:2019-02-14 08:20:43

标签: fortran

我有两个一维数组。
我想按如下方式打印内容。

  

array1:-年龄国家/地区
  array2:-a 12中国b 13智利c 14印度

输出

name = a age =12 country = china name = b age =13 country = chile name = c age =14 country = india

1 个答案:

答案 0 :(得分:1)

如果设计为使用结构数组而不是数组结构,则此问题可能会更容易。数组方法的结构看起来像

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

现在,这种方法的好处是不仅可以编译,而且可以按照正确的顺序并通过“名称列表” I / O带有标签自动对数据进行反流,因此,如果这种格式足够好,我们就不会这样做。不必编写任何奇特的输出代码。 gfortran的输出为:

&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               ",
 /