Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组和派生类型_Arrays_Types_Fortran - Fatal编程技术网

Arrays 数组和派生类型

Arrays 数组和派生类型,arrays,types,fortran,Arrays,Types,Fortran,对于我的新项目,我必须使用数组而不是临时文件来存储用户的信息。为此,我还需要创建派生类型 然而,我还不了解什么是数组,什么是派生类型,如何使用它们,它们可以做什么,以及其他一些基本概念。 有人能给我一些关于数组和派生类型的信息吗 我为他们写了代码,但我不知道写得是否正确。 如果有人能帮我查一下,我将不胜感激 以下是我的数组和派生类型: ! derived type TYPE Bank INTEGER :: acNumber, acChecks REAL :: acBlance, acRa

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

然而,我还不了解什么是数组,什么是派生类型,如何使用它们,它们可以做什么,以及其他一些基本概念。 有人能给我一些关于数组和派生类型的信息吗

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

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

! 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

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

派生类型是由用户定义的复合类型,它由多个可以是不同类型的组件组成。在其他一些语言中,它们被称为结构、结构类型或记录类型。看

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


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

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

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

b%acNumber = 5
你可以把b想象成一个壁橱,里面有不同的架子。移动已关闭的工具架时,所有工具架及其内容将一起移动

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

关于您的代码,我建议您:

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

    这是一样的,但你写得更少。还请注意,使用:和,。如果您想定义一个矩阵(您的案例),它是一个二维数组,您必须使用逗号。你写的是错的

  • 对于字符串,最好是您编写

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

    在本例中,您编写了更多内容,但您的语法已被弃用(尽管我可能错了) 另外,请记住,最好在类型中每行编写一个成员变量。这是一个品味的问题,但我更喜欢通过每个成员变量有一行来查看类型的完整大小

  • 对于MaxRows和MaxColumns,我将它们写成MAX_行和MAX_列。传统上高度恒定的参数和内容在任何主要语言中都用全大写、下划线分隔的名称标识


编辑:为了回答您的评论,这里有一个使用数组的示例

$ 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
数组就像由索引标识的同名多个变量一样。非常适用于表示向量或矩阵。
当然,您可以使用您定义的聚合类型的数组,而不是预定义的类型(例如整数)。

无需道歉。你的英语很好。人们拥有编辑权的一个原因是在这方面提供帮助。我希望我的编辑能有所帮助。谢谢你的评论。我了解什么是数组和派生类型,但我仍然对在数组中编写(在数组中存储信息)感到困惑。它像是刮刮文件吗?我是否需要使用WRITE语句来执行此操作?不需要。这就像同一变量类型的多个副本一样。你是通过作业写的。稍后我会在我的回答中添加更详细的内容。现在我得赶紧了:)注意,我纠正了你写的MaxRow,MaxColumn。正如您所写的,您没有定义二维数组。这个语法还有其他含义。谢谢你的评论和链接!
 CHARACTER(LEN=1) :: acType
 CHARACTER(LEN=15) :: acLName
 CHARACTER(LEN=15) :: acFName
$ 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