6

对于我的新项目,我必须使用数组而不是临时文件来存储来自用户的信息。为此,我还需要创建派生类型。

但是,我还没有理解什么是数组,什么是派生类型,如何使用它们,它们可以做什么,以及其他一些基本的想法。谁能给我一些关于数组和派生类型的信息?

我为他们编写了代码,但我不知道它是否正确编写。如果有人可以帮我检查一下,我将不胜感激。

这是我的数组和派生类型:

! 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
4

2 回答 2

6

如果您是一名 fortran 程序员,您可能见过一个接受 10/15 参数的子例程。如果你仔细想想,这太疯狂了(它们太多了,你冒着交换它们的风险),你很快就会意识到一些争论总是一起传播的。将它们打包在一个单独的实体下是有意义的,该实体将所有东西作为一个整体而不是作为独立实体来承载。这将大大减少参数的数量,只给您找到适当关联的负担。这个单一的实体就是类型。

在您的代码中,您说银行是这些信息的集合。您现在可以声明该类型的具体变量,它将表示并提供对单个变量 acNumber、acChecks 等的访问。为此,您必须使用 % 符号。所以如果你的银行变量被称为b,你可以说例如

b%acNumber = 5

你可以把 b 想象成一个壁橱,里面有不同的架子。你移动封闭,所有的架子和它们的内容一起移动。

数组是一组相同类型的实体(例如,整数或字符(len=1024)或银行),它们一个接一个,因此您可以使用数字索引访问它们中的每一个。请记住,除非另有说明,否则 fortran 中的数组索引从 1 开始(在所有其他主要语言中,第一个索引为零)

至于你的代码,我建议你:

  •  INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData 
    

    作为

     INTEGER :: AccountData(MaxRow,MaxColum)
    

    它是一样的,但你写的少。另请注意,使用 : 和 , 是有区别的。如果你想定义一个矩阵(你的情况),它是一个二维数组,你必须使用逗号。你写的是错误的。

  • 对于字符串,最好写

     CHARACTER :: acType*1, acLName*15, acFName*15
    

    作为

     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

数组就像多个具有相同名称的变量,由索引标识。对于表示向量或矩阵非常有用。您当然可以做一个您定义的聚合类型的数组,而不是预定义的类型(例如整数)。

于 2009-04-19T20:22:10.710 回答
0

数组是变量的有序列表,所有类型相同,以整数为索引。请参阅Wikipedia 中的数组 请注意,在 Fortran 中,数组索引比大多数其他低级语言更灵活,因为您可以拥有一个由下限、上限和步幅组成的索引三元组,而不是每个维度的单个索引。在这种情况下,表达式的左值是一个子数组,而不是数组类型的单个元素。

派生类型是用户定义的复合类型,它由多个不同类型的组件组成。在其他一些语言中,这些被称为结构、结构类型或记录类型。参见维基百科中的记录

您还可以创建一个派生类型的数组,或者您可以拥有一个派生类型,其中一个或多个组件本身就是数组,或者就此而言,其他派生类型。由你决定!

检查代码的最简单方法是尝试编译它。让它通过编译器当然不能保证程序按预期工作,但这肯定是一个必需的步骤。

于 2009-04-19T19:18:29.223 回答