数组和派生类型

时间:2009-04-18 03:01:51

标签: arrays types fortran

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

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

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

以下是我的数组和派生类型:

! 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

2 个答案:

答案 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

您也可以创建派生类型的数组,或者您可以使用派生类型,其中一个或多个组件本身就是数组,或者就此而言,还有其他派生类型。这取决于你!

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