对于我的新项目,我必须使用数组而不是临时文件来存储来自用户的信息.为此,我还需要创建派生类型.
但是,我还没有理解数组是什么,派生类型是什么,如何使用它们,它们可以做什么,以及其他一些基本想法.任何人都可以给我一些关于数组和派生类型的信息吗?
我为他们编写了代码,但我不知道它是否写得正确.如果有人能为我检查这个,我将不胜感激.
这是我的数组和派生类型:
! derived type
TYPE Bank
INTEGER :: acNumber, acChecks
REAL :: acBlance, acRate
CHARACTER :: acType*1, acLName*15, acFName*15
END TYPE
! array
INTEGER, PARAMETER :: MaxRow, MaxColum = 7
INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData
Run Code Online (Sandbox Code Playgroud)
如果你是一个fortran程序员,你可能已经看到一个接受10/15参数的子程序.如果你考虑它,它是疯了(它们太多了,你冒着交换它们的风险)而且你很快意识到一些争论总是一起旅行.将它们打包在一个整体上,将其作为一个整体,而非独立实体.这将大大减少参数的数量,只给你找到正确关联的负担.这个单一实体就是这种类型.
在您的代码中,您说银行是这些信息的汇总.您现在可以声明该类型的具体变量,该变量将表示并提供对单个变量acNumber,acChecks等的访问.为此,您必须使用%符号.因此,如果你的银行变量被称为b,你可以这样说
b%acNumber = 5
Run Code Online (Sandbox Code Playgroud)
您可以将b想象成一个壁橱,包含不同的架子.你移动封闭的,所有的架子和他们的内容一起移动.
数组是一组相同类型的实体(例如,整数,或字符(len = 1024)或Bank),它们是一个接一个,因此您可以使用数字索引访问每个实体.请记住,除非另有说明,否则fortran中的数组索引从1开始(在所有其他主要语言中,第一个索引为零)
至于你的代码,我建议你:
写
INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData
Run Code Online (Sandbox Code Playgroud)
如
INTEGER :: AccountData(MaxRow,MaxColum)
Run Code Online (Sandbox Code Playgroud)
它是一样的,但你少写.另请注意,使用:和,和之间存在差异.如果要定义矩阵(您的情况),这是一个二维数组,您必须使用逗号.你写的是错的.
对于字符串,如果你写的话会更好
CHARACTER :: acType*1, acLName*15, acFName*15
Run Code Online (Sandbox Code Playgroud)
如
CHARACTER(LEN=1) :: acType
CHARACTER(LEN=15) :: acLName
CHARACTER(LEN=15) :: acFName
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你写的更多,但你的语法被弃用(尽管我可能是错的)另外,请记住,如果你在类型中每行编写一个成员变量,那就更好了.这是一个品味问题,但我更喜欢通过每个成员变量一行来查看类型的完整大小.
对于MaxRows和MaxColumns,我会将它们写为MAX_ROWS和MAX_COLUMNS.传统中高度恒定的参数和东西用任何主要语言的全部大写,下划线分隔名称来标识.
编辑:回答你的评论,这是一个使用数组的例子
$ more foo.f90
program test
integer :: myarray(10)
myarray = 0 ! equivalent to zeroing the single elements one by one
myarray(2) = 5
myarray(7) = 10
print *, myarray
end program
$ g95 foo.f90 -o foo
$ ./foo
0 5 0 0 0 0 10 0 0 0
Run Code Online (Sandbox Code Playgroud)
数组就像具有相同名称的多个变量一样,由索引标识.表达载体或矩阵非常有用.您当然可以执行您定义的聚合类型的数组,而不是预定义的类型(例如整数).