跳转到内容

Fortran/结构体

来自维基教科书,开放的书籍,开放的世界

结构体结构化类型派生类型 (DT) 最初是在 Fortran 90 中引入的。[1] 结构体允许用户创建包含多个不同变量的数据类型

派生类型通常在模块中实现,以便用户可以轻松地重复使用它们。 它们还可以包含类型绑定过程,这些过程旨在处理结构体。 参数 pass(name), nopass 指示对象是否应作为第一个参数传递。

类似于 character 数据类型,结构体可以通过两种不同的参数类型进行参数化:kind, lenkind 参数必须在编译时已知(由常量组成),而 len 参数可以在运行时更改。

简单示例

[编辑 | 编辑源代码]

例如,我们可以定义一个新的结构体类型“Fruit”,它存储一些基本的水果变量

type fruit
    real      :: diameter  ! in mm
    real      :: length    ! in mm
    character :: colour
end type

我们可以声明两个“Fruit”变量,并为它们分配值

type (fruit) :: apple, banana
apple = fruit(50, 45, "red")
banana%diameter = 40
banana%length   = 200
banana%colour   = "yellow"

然后,我们可以在正常的 Fortran 操作中使用水果变量及其子值。

示例:类型绑定过程

[编辑 | 编辑源代码]
!> show the usage of type-bound procedures (pass/nopass arguments)
module test_m
    implicit none
    private
    public test_type
    type test_type
        integer :: i
    contains
        procedure, nopass :: print_hello
        procedure         :: print_int
    end type
contains
    !> do not process type specific data => nopass
    subroutine print_hello
        print *, "hello"
    end subroutine

    !> process type specific data => first argument is "this" of type "class(test_type)"
    !! use class and not type below !!!!
    subroutine print_int(this)
        class(test_type), intent(in) :: this

        print *, "i", this%i
  end subroutine
end module

program main
    use test_m
    implicit none
    type (test_type) :: obj

    obj%i = 1
    call obj%print_hello
    call obj%print_int
end program

示例:参数化类型

[编辑 | 编辑源代码]
! testing types with params: kind + len
program main
    implicit none
    type matrix(rows, cols, k)
        integer, len  :: rows, cols
        integer, kind :: k = kind(0.0)    ! optional/default value
        real (kind=k), dimension(rows, cols) :: vals
    end type 
    type (matrix(rows=3, cols=3)) :: my_obj
end program

参考文献

[编辑 | 编辑源代码]
  1. Fortran 90 概述 - Lahey 计算机系统
华夏公益教科书