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)将打印整个记录。为了清晰起见,对发布的示例进行了编辑。