Fortran 打印/写入嵌套的派生数据类型

Fortran 打印/写入嵌套的派生数据类型,fortran,Fortran,我从一位同事那里获得了以下模块。我试图制作一个程序,返回派生数据类型中的数据。我没有派生数据类型的经验。我尝试了程序表(文件的末尾),但没有得到任何结果。如何打印或写入派生数据类型 C======================================================================= MODULE mod_AsosCommDates C======================================================

我从一位同事那里获得了以下模块。我试图制作一个程序,返回派生数据类型中的数据。我没有派生数据类型的经验。我尝试了程序表(文件的末尾),但没有得到任何结果。如何打印或写入派生数据类型

  C=======================================================================
  MODULE mod_AsosCommDates
  C=======================================================================

  IMPLICIT NONE

  INTEGER, PARAMETER :: NCommDates=2

  TYPE ASOSData
        CHARACTER (LEN=40) :: City
        CHARACTER (Len=60) :: Location
        CHARACTER (LEN=2)  :: State
        INTEGER            :: IWBAN
        CHARACTER (LEN=4)  :: INTCALL
        CHARACTER (LEN=3)  :: USACALL
        REAL               :: DDLAT
        REAL               :: DDLON
        CHARACTER (LEN=8)  :: COMMISDATE
        CHARACTER (LEN=3)  :: PUB
        CHARACTER (LEN=3)  :: SITETYPE
        REAL               :: ANEM_FEET
        REAL               :: ANEM_METERS
  END TYPE ASOSData

  TYPE (ASOSDATA), DIMENSION(NCommDates) :: ASOSCommDates

  CONTAINS

     SUBROUTINE InitAsosCommInfo (ASOSCommDates)

     TYPE (ASOSDATA), DIMENSION(NCommDates) :: ASOSCommDates

  ASOSCommDates(1) = ASOSDATA("ANCHORAGE","LAKE HOOD SEAPLANE BASE",
 &  "AK",26491,"PALH","LHD",61.17,-149.96,"19980122","NO","FAA",
 &  33.00,10.05)
  ASOSCommDates(2) = ASOSDATA("ANCHORAGE","MERRILL FIELD AIRPORT",
 &  "AK",26409,"PAMR","MRI",61.21,-149.85,"19971015","NO","FAA",
 &  16.00,4.87)

         END SUBROUTINE InitAsosCommInfo

  END MODULE mod_AsosCommDates

  PROGRAM TABLE
  USE mod_AsosCommDates
  CALL InitAsosCommInfo(ASOSCommDates)
  PRINT *,ASOSCommDates(1)%ASOSData%City
  END PROGRAM TABLE
2016年5月25日美国东部时间上午10:54发布 最初发布的示例与本文问题相关的示例有不同的错误

NCommDates
NCommDates=886
更改为
NCommDates=2
呼叫线路从
CALL InitAsosCommInfo
更改为
CALL InitAsosCommInfo(ASOSCommDates)

编译过程中的错误是:

$ gfortran 2.for
2.for:48.39:

      PRINT *,ASOSCommDates(1)%ASOSData%City
                    1 Error: 'asosdata' at (1) is not a member of the 'asosdata' structure

尽管Fortran标准规定可以为I/O编写类型绑定过程,但许多编译器还不支持这一点。因此,最简单的解决方案是按组件打印派生类型

但是,在代码中,访问组件时不需要指定类型:

PRINT *,ASOSCommDates(1)%City

。。。与其他组件类似。

派生类型不包含任何私有、指针或可分配组件,因此在输入或输出列表中,该类型的对象会自动展开为其组件列表。最奇怪的是,您没有得到任何东西。我实际上收到了编译时错误消息。“什么都没有”对您意味着什么?编译问题是因为我的CALL语句不正确。最初是调用initasocominfo。它被编辑为
调用initasomminfo(asosommdates)
。然而,亚历山大·沃格特(Alexander Vogt)的评论回答了我最初的问题,关键是你应该始终在你的帖子中包含错误信息。无论如何,一定要尝试打印*,ASOSCommDates(1)。正如@VladimirF建议的打印*,ASOSCommDates(1)将打印整个记录。为了清晰起见,对发布的示例进行了编辑。