数组和派生类型

6 arrays fortran types

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

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

我为他们编写了代码,但我不知道它是否写得正确.如果有人能为我检查这个,我将不胜感激.

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

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

Ste*_*ini 6

如果你是一个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)

数组就像具有相同名称的多个变量一样,由索引标识.表达载体或矩阵非常有用.您当然可以执行您定义的聚合类型的数组,而不是预定义的类型(例如整数).