【问题标题】:How do variable declarations within types work in Fortran?类型内的变量声明如何在 Fortran 中工作?
【发布时间】:2022-01-06 19:59:08
【问题描述】:

我正在尝试学习 Fortran,但我发现那里的教程并不多(可能是因为它是一种古老的语言)。我发现的那些是含糊不清的,而且随着我进入更复杂的事情,猜测教程所说的内容变得越来越难。
我目前的问题是创建类型。本教程包含以下示例:

module m_shapes
  implicit none
  private
  public t_square

  type :: t_square
  real :: side
  contains
    procedure :: area  ! procedure declaration
  end type

contains

  ! Procedure definition
  real function area(self) result(res)
    class(t_square), intent(in) :: self
    res = self%side**2
  end function

end module m_shapes

这编译得很好,所以我知道它可以工作。
当我尝试做类似这样的事情时:

program type_test
    implicit none
    type :: thingy(a)
        real :: a
    end type
end program 

编译时不会出现错误,例如“出现在 (2) 的类型参数列表中的 (1) 的组件既没有 KIND 也没有 LEN 属性”

我找到的教程对类型的解释不够好,我尝试过real,kind :: a = kind(0.0) 之类的方法,但无济于事。有谁知道怎么回事?

提前致谢。

【问题讨论】:

  • 欢迎您,请拨打tour。您必须搜索非常糟糕,因为实际上有很多 Fortran 教程。也许您搜索了“Fortran 90”(正如您使用的标签所暗示的那样),但这实际上已经很老了,完全过时了,而且大部分都被遗弃了。但是 Fortran 继续发展,b 社区主要使用标准的现代修订版。你可以从fortran-lang.org开始
  • 请注意,即使您的考试不是 Fortran 90,但至少是 Fortran 2003。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: fortran


【解决方案1】:

你没有解释你真正想要做什么。或者你的话还不够清楚。我们可以告诉你为什么你的尝试会产生错误,但我不知道你真正想要做什么。


也许你只是想要

program type_test
    implicit none
    type :: thingy
        real :: a
    end type
end program 

没有(a)?这声明了一个带有一个组件的简单类型。但很难猜测这是否是您想要的以及您使用 (a) 尝试过的。

它没有声明任何具有该类型的变量。这是使用

  type(thingy) :: var

语法

  type :: thingy(a)
        real :: a
  end type

尝试声明parametrized derived type。这些类型可能取决于种类或长度参数。这些参数必须是整数。如果它是一个 kind 参数,它允许用这些参数的不同值声明类型的变量。然后类型的一些组件的类型(你知道是什么类型,对吗?Fortran 90 kind parameter )根据参数的值获取它们的类型。如果它是一个长度参数,它允许对派生类型的某些数组或字符串组件的长度进行参数化 - 在变量声明期间设置。

括号中出现的这些参数必须是整数分量,并且必须具有kindlen 属性。

例如

  type :: param_type(k,l)
     integer, kind :: k
     integer, len :: l
     real(kind=k), dimension(l) :: array
  end type param_type

  type(param_type(kind(1.), 10)) :: o_sp_10  
  type(param_type(kind(1.d0), 20)) :: o_dp_20

参数的值是在o_sp_10o_dp_20 对象的声明期间设置的。我不想详细说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多