linux fortran 结构体,Fortran 结构体数组作为全局变量传递数据

派生数据类型和结构体

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

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

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

TYPE[::]派生类名

成员列表

ENDTYPE[派生类名]

举个栗子:

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

文章来源: blog.csdn.net,作者:豸叹,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40935730/article/details/111773109

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值