对于我的新项目,我必须使用数组而不是临时文件来存储来自用户的信息。为此,我还需要创建派生类型。
但是,我还没有理解数组是什么,派生类型是什么,如何使用它们,它们可以做什么,以及其他一些基本想法。 任何人都可以给我一些关于数组和派生类型的信息吗?
我为他们编写了代码,但我不知道它是否写得正确。 如果有人可以帮我查一下,我会很感激。
以下是我的数组和派生类型:
! 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
答案 0 :(得分:6)
如果你是一名fortran程序员,你可能已经看到一个接受10/15参数的子程序。如果你考虑它,它是疯了(它们太多了,你冒着交换它们的风险)而且你很快意识到一些争论总是一起旅行。 将它们打包在一个整体上,将其作为一个整体,而非独立实体。这将大大减少参数的数量,只给你找到正确关联的负担。这个单一实体是类型。
在您的代码中,您说银行是这些信息的汇总。您现在可以声明该类型的具体变量,该变量将表示并提供对单个变量acNumber,acChecks等的访问。为此,您必须使用%符号。因此,如果您的银行变量名为b,您可以说例如
b%acNumber = 5
你可以把b想象成一个壁橱,包含不同的架子。你移动封闭的,所有的架子和他们的内容一起移动。
数组是一组相同类型的实体(例如,整数,或字符(len = 1024)或Bank),它们是一个接一个,因此您可以使用数字索引访问每个实体。请记住,除非另有说明,否则fortran中的数组索引从1开始(在所有其他主要语言中,第一个索引为零)
至于你的代码,我建议你:
写
INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData
作为
INTEGER :: AccountData(MaxRow,MaxColum)
它是一样的,但你少写。另请注意,使用:和,和之间存在差异。如果要定义矩阵(您的情况),这是一个二维数组,您必须使用逗号。你写的是错的。
对于字符串,如果你写
,那就更好了 CHARACTER :: acType*1, acLName*15, acFName*15
as
CHARACTER(LEN=1) :: acType
CHARACTER(LEN=15) :: acLName
CHARACTER(LEN=15) :: acFName
在这种情况下,你写的更多,但你的语法已被弃用(但我可能错了) 另外,请记住,如果在类型中每行写一个成员变量,那会更好。这是一个品味问题,但我更喜欢通过每个成员变量一行来查看类型的完整大小。
对于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
数组就像具有相同名称的多个变量一样,由索引标识。表达载体或矩阵非常有用。 您当然可以执行您定义的聚合类型的数组,而不是预定义的类型(例如整数)。
答案 1 :(得分:0)
数组是变量的有序列表,所有变量都是相同的类型,由整数索引。请参阅Array in Wikipedia请注意,在Fortran数组中,索引比大多数其他低级语言更灵活,因为每个维度而不是单个索引,您可以拥有由下限,上限和步幅组成的索引三元组。在这种情况下,表达式的左值是一个子数组而不是数组类型的单个元素。
派生类型是由用户定义的复合类型,由多个可以是不同类型的组件组成。在其他一些语言中,这些语言被称为结构,结构类型或记录类型。见Record in Wikipedia
您也可以创建派生类型的数组,或者您可以使用派生类型,其中一个或多个组件本身就是数组,或者就此而言,还有其他派生类型。这取决于你!
检查代码的最简单方法是尝试编译它。让它通过编译器当然不能保证程序按预期工作,但它肯定是必需的步骤。