寻找构造Simto VB的WITH陈述式

时间:2018-07-30 13:37:20

标签: fortran

更新一些不再完全支持我们需求的F77。我正在寻找与VB的“ WITH”语句等效的功能,以支持从大量F77断开连接的单个变量到分层派生类型的转换。虽然代码更容易阅读和理解,但缺点是代码变得非常笨拙并且容易出现拼写错误。因此,使用WITH将大大减轻转换负担。

VB的“ WITH”语句在单个对象或用户定义的类型上执行一系列语句。 例: 如果我要引用派生的类型为Loads的元素,我会在每个元素的前面加上以Loads%为前缀的代码,这很麻烦。 WITH语句允许使用假定的对Loads%的引用来重写该块。

WITH Loads%
   ID = blah
   Description = blahblah
   Duty(I) = 2
End WITH

建议...?

1 个答案:

答案 0 :(得分:2)

没有Fortran构造提供与您所说的VB的with语句完全类似的构造。对于您的特定示例,您可以按照...的方式写一些东西。

给出派生类型定义,例如

type :: load
    character(4) :: id
    character(32) :: description
    integer, dimension(4) :: duties
end type load

和该类型的变量

type(load) :: loads

您可以使用默认的构造函数来设置loads的成员的值,如下所示:

loads = load('myid', 'my description', [1,2,3,4])

甚至是这样:

loads = load(duties=[3,4,5,6], id = 'id2', description='description')

如果您围绕SO进行Q和As的研究,并且以 Fortran派生类型构造函数为主题,那么您将发现如何构建更复杂的构造函数,这些结构不需要给出所有成员值被调用时。互联网上其他地方也有一些有用的资源。

如果您担心的一个问题是避免输入长且可能是多部分的实体名称,那么associate构造可能会有所帮助。例如,如果您想避免输入而不是loads而不是long%structured%entity这样的变量,则可以这样写

associate (shnm => long%structured%entity`)
    shnm%id = 'idxx'
    *etc*
end associate

我相信您可以轻松地提出使用with的更多示例,如果不重复编写loads%,将很难将其转换为Fortran。