让 Fortran 中的函数返回一个可以放置在赋值左侧的引用

2024-01-28

正如标题所述,我想要directly修改我通过从函数检索的指针访问的数据。函数返回的引用出现在 l.h.s 上。赋值(=)在 C++ 中没有问题,但 Fortran 中的以下最小示例会出错:

module test_mod
  implicit none

  integer, target :: a=1, b=2, c=3 ! some member variables

contains

  function get(i)
    integer, pointer :: get
    integer, intent(in) :: i

    select case (i)
      case (1)
        get => a
      case (2)
        get => b
      case (3)
        get => c
    end select 
  end function get

end module test_mod

program test
  use test_mod
  implicit none
  integer, pointer :: i_p

  !> prints out 1 2 3
  print*, get(1), get(2), get(3)

  !> this is what I want but I get the error
  !> Error: 'get' at (1) is not a variable
  get(2) = 5

  !> this works but is not what I want
  i_p => get(2)
  i_p = 5

end program test

有什么办法可以实现这种行为吗?也许我缺少一些属性?我想绕过编写任何设置器例程,例如

set(i,value)

因为它应该模仿数组的外观。 在我的应用程序中,成员变量a,b,c实际上是不同大小的数组

a = [a1, a2, a3]
b = [b1, b2]
c = [c1]

我想要吸气剂get(i,j)模仿指针矩阵

        j = 1   2   3

i = 1:   [[a1, a2, a3],
i = 2:    [b1, b2, XX],
i = 3:    [c1, XX, XX]]

wehre XX将参考null().

Update:我使用的是 gfortran(版本 5.2.0),部署计算机只有从 4.6.x 及更高版本开始的版本。因此,不幸的是,建议的 fortran 2008 标准功能对我来说不可用。是否可以在没有开箱即用的编译器支持的情况下模仿上述行为?

更新2:所以我最终实现了如下结构

type Vec_t
  integer, allocatable, dimension(:) :: vec
end type Vec_t
type(Vec_t), allocatable, dimension(:), target :: data

我像这样初始化(我在最后提到的我的三角矩阵应用程序)

allocate(data(max))
do i=1,max
  allocate(data(i)%vec(i))
end do

我通过以下方式访问和写入它

print*, data(2)%vec(1)
data(2)%vec(1) = 5

这并不完全是我想要的,但对于我的申请来说已经足够了。


让我们看看您想要做什么:

get(2)=5

和错误消息

错误:(1) 处的“get”不是变量

这看起来很全面:你不能做你想做的事。也许...

get(2)根据 Fortran 2003 的规则,确实不是变量。在 Fortran 2003 中,变量由规则 R601 和 R603 给出,它是指示符列表。

赋值的左侧必须是变量。

但是看看 Fortran 2008 及其变量的定义。现在,变量可以是相同的指示符之一(或者与协数组或复杂部分相关的指示符),但它也可以(C602 到 R602)是函数引用,

应有一个数据指针结果。

Fortran 2008 的介绍对此进行了总结,详细介绍了 Fortran 2003 的扩展,如下

指针函数引用可以表示任何变量定义上下文中的变量。

get(2)是对具有数据指针结果的函数的引用。get(2)根据 Fortran 2008 的规则,then 可能出现在赋值语句的左侧。

唉,Fortran 的这种解释是没有得到广泛支持 http://dx.doi.org/10.1145/2808700.2808703由当前编译器:在仅回答 Cray 编译器时。

这意味着这个答案实际上是说你有两个选择:切换编译器或等到这个功能更广泛。由于这两种方法都可能不切实际,因此您可能需要另一个答案,该答案可以提供稍微更便携的解决方法。

I prefer my link to that http://fortranwiki.org/fortran/show/Fortran+2008+status given by innoSPG, as although this latter is based on the former, the description of the appropriate field "Pointer functions - pointer function ref is a variable" is slightly more clear. This is, though, a more accessible document and a viable alternative.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让 Fortran 中的函数返回一个可以放置在赋值左侧的引用 的相关文章

  • 使用泰勒展开式计算正弦的程序不起作用?

    我正在尝试编写一些代码 使用泰勒展开计算 sin 0 75 的值 并打印每次迭代 直到使用展开计算的值与使用 Fortran 的内在 sin 函数计算的值之间的绝对差为小于1E 6 这是我的代码 program taylor implici
  • Fortran 输出为两行而不是一行

    我正在运行一个 fortran 90 程序 该程序有一个 i 1 到 40 的 alpha 值数组 我尝试使用以下代码将数组输出为 5 行 每行 8 行 write 4 alpha write 4 alpha 1 alpha 2 alpha
  • 为什么在 Fortran 中使用命令 PRINT 会覆盖输入文件?

    我正在编写代码并使用 Fortran 中的输入和输出功能 代码看起来像这样 仅用于简化 PROGRAM TEST REAL DIMENSION 1000 A REAL B INTEGER T Defining input and outpu
  • 将分配给 Fortran 数组的 C_PTR 传递给 C

    我在访问 C 中的数组时遇到段错误 该数组在下面的 Fortran 文件中分配 有一些调试问题 例如文件写入没有写入任何有意义的内容 并且我初始化了一个变量i我从来没有用过 但是 我发现了以下内容 未初始化i 但仍然声明 没有段错误 未在
  • 为什么 OpenMP SIMD 指令会降低性能?

    我正在学习如何在 OpenMP Fortran 中使用 SIMD 指令 我 写了简单的代码 program loop implicit none integer i j real 8 x x 0 0 do i 1 10000 do j 1
  • f77 未格式化二进制文件的内容

    我有一个 f77 未格式化的二进制文件 我知道该文件包含 2 个浮点数和一个长整数以及数据 文件的大小为 536870940 字节 应包含 512 3 个浮点数据值以及 2 个浮点和长整数 512 3 个浮点数据值组成 536870912
  • 在 fortran 中生成序列数组

    Fortran中是否有一个内在函数可以生成一个包含从a到b的数字序列的数组 类似于python的range gt gt gt range 1 5 1 2 3 4 gt gt gt range 6 10 6 7 8 9 不 没有 但是 您可以
  • 为什么我必须在 Fortran 中隐式指定函数的双精度返回值?

    我是 Fortran 新手 我正在尝试common堵塞 我的代码很简单 program main implicit double precision p real 8 x y common yvalue y x 3d0 y 3d0 prin
  • SELECT TYPE 构造中的多态性分配

    我试图定义一个分配不同类型数组的子例程 这是代码的简化版本 subroutine Allocation1 Vec class allocatable intent out Vec select type Vec type is real 8
  • 在 Fortran 90 中,是否必须事先声明数组维度?

    是否有必要在任何其他代码之前声明数组维度 例如 我编写了以下简化的示例代码 PROGRAM mytest IMPLICIT NONE INTEGER i j k mysum Let array c be a k by k 2 array D
  • Fortran 读取混合字符串和数字数据

    我在读取语句时遇到问题 我更喜欢 Fortran90 尽管如果有帮助的话其他版本也是可能的 我的文件中有一堆数据行 可以描述为 以空格分隔 没有固定的格式 包含一个字符串 后跟 7 个数字 字符串包含正斜杠 这是一个例子 maxele OS
  • 如何使用模块向 Fortran 公开 Python 回调

    这个 scipy 文档页面 http docs scipy org doc numpy dev f2py python usage html call back arguments关于 F2Py 指出 回调函数 也可以在模块中显式设置 然后
  • Fortran 中指数函数的 DEXP 或 EXP?

    我有两个非常简短的问题 1 我刚刚读到DEXP is the archaic的形式EXP 这是否意味着不应再使用它 我一直以为DEXP 双精度等于EXP 2 指数函数的范围是多少 它依赖于编译器吗 问题 1 在现代 Fortran 中 最好
  • OpenMP 因大型数组而崩溃

    我正在使用 Fortran 和 OpenMP 但当我尝试在存在大型数组时使用 OpenMP 并行化循环时 我不断遇到问题 例如 以下代码 PROGRAM main IMPLICIT NONE INTEGER PARAMETER NUMLOO
  • 将 C 字符串数组传递给 Fortran (iso_c_binding)

    如何传递 C 字符串数组 char cstrings 到 Fortran 子程序 问题使用 iso c binding 的 fortran C 桥接器中的字符串数组 https stackoverflow com questions 968
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • Fortran 函数:指针作为实际参数,目标作为形式

    我正在尝试破译 Fortran 代码 它将指向函数的指针作为实际参数传递 而形式参数则是目标 它在主程序中定义并分配一个 globalDATA 类型的指针 然后调用一个传递该指针的函数 module dataGLOBAL type glob
  • fortran中双引号和单引号的区别?

    我刚刚开始使用 Fortran 对双引号和单引号的使用感到困惑 它们是等价的 它们的用法没有区别 您可以使用它来打印引号字符之一 print print 首先打印 进而 注意 您还可以在一行中使用两个引号字符来打印一个 print prin
  • 从 Fortran 字符串中提取单个字符

    我需要一个程序将基数 a 转换为基数 b 其中基数 a 和 b 可以是从 2 到 36 我的想法是使用字符串作为数字 作为中介转换为基数 10 然后从基数 10 转换为基数 b 由于我是 Fortran 新手 我不太理解函数和子字符串 现在
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在

随机推荐

  • 从 Windows Phone 8 设备检索故障转储

    有没有办法在开发期间从 Windows Phone 8 中获取故障转储 我正在寻找一个与普通 Win32 应用程序崩溃时类似的转储文件 或者类似于崩溃时 iOS 设备上保存的内容 以便稍后进行调查 我的问题具体是关于在崩溃后以某种方式从手机
  • App Engine 上的 Flask-SQLAlchemy 使用以下命令连接到 Cloud Compute Engine 上的 MSSQL 数据库

    我对整个 GCP 非常陌生 我需要为客户的项目部署 Flask 应用程序 考虑到 Google 提供的所有文档 部署应用程序非常简单 而且由于使用灵活的应用程序引擎似乎是最简单的方法 因此我正在尝试使用它 我遇到的问题是尝试连接到在计算引擎
  • getaddrinfo:节点名称或服务名称已提供,或未知

    我有一个 Ruby on Rails 应用程序 正在运行 Mac OS X 10 6 的计算机上部署 出现问题的代码是由delayed job 运行的 仅当通过delayed job运行时才会出现该问题 如果我在控制台中运行它 rails
  • 消除重复的多边形州/国家/地区共享边界

    我正在使用 GEOJSON 绘制带有传单的世界地图 并用虚线绘制边界 如下图所示 The problem I am having is that the line is not shared by two states if two sta
  • 使用 Typescript 导入 Electron 类

    如何将 Electron 类导入 Typescript 文件 以便智能感知正常运行 例如 我想把这个 var BrowserWindow require browser window var app require app app on r
  • 在单独的进程上运行 Goroutines(多处理)

    我目前有一个 MQTT 代码 可以订阅主题 打印收到的消息 然后向新主题发布进一步的指令 这订阅 打印在一个 Goroutine 中完成 并且出版是在另一个 Goroutine 中完成的 这是我的代码 var wg pg sync Wait
  • .net 中的数据类型和 C# 中的数据类型哪一种更快? [复制]

    这个问题在这里已经有答案了 大家好 首先我很抱歉 因为我的母语不是英语 我想了解 C 数据类型和 net 数据类型哪一种更快 我尝试通过下面的代码来理解 我认为 net 数据类型更快 这是正确的吗 我在 x86 和 x64 平台上测试了这段
  • 在Spring中正确使用Log4jConfigurer

    在我们的应用程序中 我们决定将 log4j 配置文件命名为自定义名称 以避免无意中从另一个 jar 加载默认文件 为了配置它 我们使用org springframework util Log4jConfigurer指定 log4j 位置
  • 在 Windows Phone 8.1 中以编程方式检测重新启动

    我有一个 WP 8 1 运行时 它启动了DeviceUseTrigger后台任务 问题是 每当手机重新启动时 该任务显然会取消 但任务注册仍然存在 所以当我下次启动我的应用程序时后台任务appears在现实没有跑步的情况下跑步 我想要某种方
  • 延迟脚本加载

    所以如果我有以下内容 我只是想延迟使用 settimeout 调用该文件的执行 我该怎么做 很奇怪的是 我在一个简单的函数上使用 settimeout 没有问题 但我在这个看似更简单的情况下有点困惑 我的想法是我可以创建一个在 x 时间后调
  • Apache Camel Java DSL 在正文中添加换行符

    因此 我在 Java DSL 中设置了一个 netty4 套接字路由 如下所示 Override public void configure throws Exception String dailyDataUri SOCKET daily
  • AWS 工作层 cron - 服务器错误 #500 - “发布 http 1.1 500 AWS aws-sqsd/2.0”

    我正在尝试在 Elastic Beanstalk 上设置一个 cronjob 任务正在安排中 出于测试目的 它应该每分钟运行一次 但是它不起作用 这是一个 Django 应用程序 该应用程序在两个环境中运行 一个是工作环境 另一个是 托管
  • Flutter - 检测充满其他小部件的屏幕上的点击

    我正在尝试检测屏幕上的点击 我尝试过使用的多种变体GestureDetector但这只会导致应用程序检测到点击子元素 and 不是屏幕 这是代码 class QQHome extends StatelessWidget override W
  • 如何平滑徒手绘制的 SVG 路径?

    我正在寻找一种解决方案 将由大量 auf LineTo 段组成的手绘 用户绘制的 SVG 路径转换为更平滑的路径 首选语言是 JavaScript 但欢迎任何建议 首先 我建议使用一个好的图形库 例如raphael 它将简化实际使用 jav
  • iOS 8 横向:键盘无法正确显示

    我有一个为 iOS8 编译的应用程序 该应用程序在项目设置中设置为仅允许纵向 根据设计 应用程序的视图不会旋转为横向 在 iOS7 中 当您旋转设备以横向时 键盘不会旋转 这是我想要的行为 但是 在 iOS8 中 当您将设备旋转到横向时 键
  • 使用 RecyclerView 适配器更新数据的最佳方法[重复]

    这个问题在这里已经有答案了 当我必须使用经典适配器时ListView https developer android com guide topics ui layout listview html 我在 ListView 中更新数据 如下
  • inno-setup 脚本中的可选组件和类型

    我创建了以下 InnoSetup 脚本 用于添加可选组件 遵循此 StackOverflow 答案的建议 Inno Setup 正确使用 类型 组件 和 任务 https stackoverflow com questions 889082
  • 获取额外数据透视表列的值 laravel

    我有一个phone models phone problems 和一个phone model phone problem 数据透视表 数据透视表有一个额外的列 价格 手机型号 class PhoneModel extends Eloquen
  • 图像不会出现在闪亮应用程序的 www 文件夹中

    我正在遵循上一个问题中的代码 R Shiny 将图片添加到带有文本的流体行中的框 https stackoverflow com questions 44279773 r shiny add picture to box in fluid
  • 让 Fortran 中的函数返回一个可以放置在赋值左侧的引用

    正如标题所述 我想要directly修改我通过从函数检索的指针访问的数据 函数返回的引用出现在 l h s 上 赋值 在 C 中没有问题 但 Fortran 中的以下最小示例会出错 module test mod implicit none