派生数据类型和结构体

所谓派生数据类型指的就是,程序设计人员根据数据特征自己定义的、由不同类型数据成分组成的数据类型,它把复杂的数据用一种抽象和形式化的方式描述出来,实际上并未进行实质性的存储空间分配,这个是我们要注意的。

所谓结构体就是在存储器内按照派生数据类型描述的内容分配具体的存储区域,它是派生数据类型数据的具体体现,结构体也称为记录。

可以理解为一个抽象,一个具体。

 


 

TYPE [::] 派生类名

     成员列表

END TYPE [派生类名 ]


举个栗子:

program stru_test
    implicit none
    type stu_record    !定义的派生数据类型,储存“学生”身份的属性
        character(len=8) :: name
        integer :: score
    end type stu_record

    type(stu_record) student_A     !定义结构体student_A,具有student_record的一切属性


    student_A.name = "zhangsan"
    student_A.score = 99

    write(*,*) student_A.name,student_A.score
end program stru_test

派生数据类型包含不同类型的数据项成分,是一种新型的数据类型,它能把一些相关的数 据成分汇集在一起,便于对其进行统一处理。

但是我想的是有很多相同类型的结果体,可以理解为集体里很多成员属性相同,这时就需要一个结构体数组

program stru_test

    implicit none
    type stu_record                 !定义的派生数据类型,储存“学生”身份的属性
        character(len=10) :: name
        integer :: score
    end type stu_record
    integer,parameter :: nstudent = 30

    type(stu_record) student_A     !定义结构体student_A,具有student_record的一切属性
    type(stu_record) class_key(nstudent)  !定义的结果体数组,储存具有“学生”身份的全部成员
    
    student_A.name = "zhang"
    student_A.score = 99
    write(*,*) student_A.name,student_A.score
    
    
    class_key(1).name = 'li'        !调用第一个成员,
    class_key(1).score = 60
    write(*,*) class_key(1).name,class_key(1).score

end program stru_test

 下面就是困扰我一晚上的问题,我想把这个结构体数组作为全局变量使用,而且成员数目不确定,这就需要nstudent不是一个确定的数,编译不通过。触类旁通加上脑洞大开给想出来了:

module stu_module
    implicit none
    type stu_record                 !定义的派生数据类型,储存“学生”身份的属性
        character(len=10) :: name
        integer :: score
    end type stu_record
    
    integer:: nstudent
    type(stu_record) student_A     !定义结构体student_A,具有student_record的一切属性
    type(stu_record),allocatable :: class_key(:)  !定义的结果体数组,储存具有“学生”身份的全部成员
    
    contains
        subroutine get_class
            allocate(class_key(nstudent)) 
        end subroutine get_class
end module stu_module

program stru_test
    use stu_module
    implicit none

    nstudent = 10
    call get_class  !调用子程序对结构体分配维度
    
    student_A.name = "zhang"
    student_A.score = 99
    write(*,*) student_A.name,student_A.score
    
    
    class_key(1).name = 'li'        !调用第一个成员,
    class_key(1).score = 60
    write(*,*) 'main:'
    write(*,*) class_key(1).name,class_key(1).score
    call sub1
    
    deallocate(class_key)
end program stru_test

subroutine sub1
    use stu_module
    implicit none
    class_key(1).score = 100
    write(*,*) 'sub1:'
    write(*,*) class_key(1).name,class_key(1).score
end subroutine sub1

如上,只是简单举个例子,实际应用比这复杂得多,实际上最关键的一步实在module里定义可分配大小的结构体数组,这一点和数组相似,提一下,get_class里的分配大小也可以放在主程序里定义了nstudent之后。

 

20201227

参考资料

[1] 白海波.FORTRAN程序设计权威指南[M]. 北京:机械工业出版社,2013