将标量和数组元素传递给需要数组的过程

2023-11-29

我有一些遗留的 Fortran 77 代码,我试图至少在不发出警告的情况下进行编译(不禁用警告)。有些子例程调用会传递一个标量,而子例程需要一个数组,因为标量被用作大小为 1 的数组,所以这不会导致任何问题。但是使用英特尔编译器,如果我启用接口警告,我会得到这个error:

error #8284: If the actual argument is scalar, the dummy argument shall be scalar unless the actual argument is of type character or is an element of an array that is not assumed shape, pointer, or polymorphic.

在某些情况下,我尝试通过使用数组和标量变体重载子例程来解决此问题,但是当传递的参数是“数组的元素”(被检测为标量)时,我会遇到问题。考虑以下示例(使用 gfortran 测试):

program a
  integer n,dum(3)
  interface readn
    subroutine readn_s(n,m)
      integer m,n
    end subroutine
    subroutine readn_a(n,m)
      integer m,n(*)
    end subroutine
  end interface
  call readn(n,1)
  write(6,*) 'n=',n
  call readn(dum,3)
  write(6,*) 'dum=',dum
  call readn(dum(2),2)
  write(6,*) 'dum=',dum
end program

subroutine readn_s(n,m)
  integer i,m,n
  n=2
end subroutine

subroutine readn_a(n,m)
  integer i,m,n(*)
  do i=1,m
    n(i)=1
  end do
end subroutine

The readn(dum,3)正确调用使用readn_a,而第二个使用readn_s。预期的行为是两者都应该使用readn_a。事实上,如果我将这两个调用替换为readn_a一切都如预期。

当实际参数是数组元素时,是否可以使其正常工作并使用重载例程的“数组”版本?我发现如果我调用子例程它会起作用readn(dum(2:),2),但恐怕会创建数组的临时副本......

原来的问题:

file.f90

program a
  integer n,dum(3)
  call readn_a(n,1)
  write(6,*) 'n=',n
  call readn_a(dum,3)
  write(6,*) 'dum=',dum
  dum=3
  call readn_a(dum(2),2)
  write(6,*) 'dum=',dum
end program

文件2.f90

subroutine readn_a(n,m)
  integer i,m,n(*)
  do i=1,m
    n(i)=1
  end do
end subroutine

编译用gfortran -Wall file.f90 file2.f90 or ifort file.f90 file2.f90,一切都很好,输出是预期的:

 n=           1
 dum=           1           1           1
 dum=           3           1           1

编译用ifort -warn all file.f90 file2.f90我得到了error #8284多于。所以这就是为什么我想要一个可以处理标量或数组的子例程版本......但会给出带有数组元素的数组版本。


在您尝试的解决方案中,类型种类排名通用解析会将所有数组元素委托给子例程的标量版本,并且不会在数组部分上执行预期的工作。所以“预期的行为是两者都应该使用 readn_a。”使用您选择的方法实际上是不可能的。

好吧,当您重写代码以传递数组部分时,正如您自己指出的那样,这是可能的。但我们又遇到了和以前一样的问题,你的例子被简化了。我们可以确定您所显示的示例中没有临时数组,但我们绝对不能对您的真实代码这么说。如果您从某个随机位置开始使用一些 2D 小节,那么您肯定会拥有临时数组,并且可能根本难以制作正确的小节。

在原始遗留代码中应该很容易避免原始警告。 FORTRAN 77 没有非连续数组,因此如果您将参数保留为integer :: a(*)代替integer :: a并进一步传递。如果您的原始变量是标量,那就是一个问题。


问题是整数标量不构成元素序列:

F2008 12.5.2.11 1 实际参数表示元素序列如果 它是一个数组表达式,数组元素指示符,默认值 字符标量,或带有 C 字符的字符类型标量 种类(15.2.2)。 ...

数组元素指示符a(2)是一个元素序列,但标量n is not.

因此不允许在传递数组元素时使用序列关联:

F2008 12.5.2.11 4 一个实际参数代表一个元素 顺序并且对应于一个虚拟参数,它是一个数组 如果虚拟参数是,则与虚拟参数关联的序列 显式形状或假定大小的数组。 ...

您的代码并不严格符合 Fortran 标准,但如果您设法编译它,很可能会按预期工作。


可能的解决方案:

  • 您可以将参数作为数组表达式传递,但不能在子例程内部修改参数

    call readn_a([n],1)

  • 您只需禁用有关接口匹配的警告即可

    ifort -warn nointerfaces

  • 您可以创建仅适用于标量的单独子例程,并以不同的名称调用它。

  • 您还可以通过英特尔编译器指令禁用该虚拟参数的参数检查

    !DEC$ ATTRIBUTES NO_ARG_CHECK :: dummy-arg-name

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

将标量和数组元素传递给需要数组的过程 的相关文章

  • createNativeQuery 设置参数

    我有以下内容 其中包含 NativeQuery 我需要在其中设置参数 但有些事情是错误的 因为未设置参数 因此查询是 SELECT movieId title genres FROM movies where title like 所以返回
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • 为什么即使参数作为命名参数传递,参数的顺序仍然保持不变?在 JavaScript 中

    例如在Python中 def dfde name age print age print name print age dfde age 27 name dfd 输出如下 27 dfd 27 但 javascript 中的某些内容将输出如下
  • html 表单发布到 Flex 应用程序

    我有一个基本完成的 Flex 应用程序 它使用 Zend AMF 来连接 提供数据 我的应用程序确实有一个登录屏幕 看起来工作正常 现在我想在我的网站上添加另一个登录表单 允 许用户输入用户名 密码 提交表单时应将数据传递给 Flex 应用
  • 指定 gfortran 应该在其中查找模块的目录

    我目前基于模块来编译程序 例如主程序foo这取决于模块bar 如下 gfortran c bar f90 gfortran o foo exe foo f90 bar o 当foo f90 and bar f90位于同一目录中 如何指定 g
  • org.apache.jasper.JasperException:未指定默认命名空间时,函数测试必须使用前缀

    我在我的项目中使用以下内容 Spring 3 0 1 Apache Tiles 2 2 1 Glassfish 2 1 我想做的是调用 jsp 页面中的某些方法并向其传递一些参数 例如 我有一个豆子 Component Scope valu
  • 在一条语句中对多个变量进行相同的赋值

    有没有一种方法可以为不同的变量分配相同的值 而无需在单个语句中构造数组 例如 如果我有变量a b c d and e 我可以分配类似的东西吗 a b c d e 10 0 我知道我可以用一行来做 a 10 0 b 10 0 c 10 0 d
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 我可以将文件指针移动到格式化文件中的特定(字节)位置吗?

    我正在读取格式化的 ascii 文件 该文件本质上是 ascii 编码的 看起来像这样 fieldname 1 header info 1 header info 2 header info 3 aruieopaurjjk 0uio3789
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • 我真的应该大量引入explicit关键字吗?

    When I used the recently released Cppcheck 1 69 on my code1 https i stack imgur com tHt25 png it showed a whole lot of m
  • Fortran90 中 BLAS 函数返回零

    我正在学习在Fortran90中使用BLAS 并使用子例程编写了一个简单的程序SAXPY https software intel com en us mkl developer reference fortran axpy和函数SNRM2
  • 如何在类型提示中定义元组或列表的大小

    有没有办法在参数的类型提示中定义元组或列表的大小 目前我正在使用这样的东西 from typing import List Optional Tuple def function name self list1 List Class1 if
  • Fortran :: (1) 处 OPEN 语句中存在语法错误

    我试图通过 顽固测试 来测试我的密码算法 http stat fsu edu pub diehard http stat fsu edu pub diehard 我意识到我的输入文件必须是未格式化的直接访问文件 所以我尝试用 Fortran
  • 分发编译后的 fortran 库和模块文件

    我有一个Fortran使用很多模块的库 我用ifortWindows 上的编译器 因此 我得到一个 lib图书馆的文件和 mod所用模块的文件 这有一个缺点 我还必须分发 mod文件 如果我想在另一个程序中使用编译的库 如何防止这种情况发生
  • Fortran DLL 导入

    Fortran 中有一段代码罗伯特 L 帕克和菲利普 B 斯塔克 http www stat berkeley edu 7Estark Code sbvq f FORTRAN subroutine bv key m n a b bl bu
  • 将结构化数据类型从 Fortran 传递到 C++ [重复]

    这个问题在这里已经有答案了 我在 Fortran 中有一个结构化类型 其中包含大量数据 包括指针 real 8 指针数据类型 我正在为某些 Fortran 例程开发 C API 我需要在对 Fortran 例程的调用之间保留该结构的内容 我
  • 如何将变量从外部 JavaScript 传递到 HTML 表单

    我一直试图将一个值从外部 javascript 文件传递 到 HTML 表单 但没有成功 这些文件相当大 所以我不确定我可以解释这一切 但我会尝试 基本上 用户单击一个链接 然后启动一个 js 文件 新 HTML 页面加载后立即执行 我需要
  • Fortran 指针数组

    同样 Fortran 中的指针数组 好吧 我有一个派生类型 type t context pointer type t context pointer p ctx end type t context pointer 当我在主程序中执行以下
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回

随机推荐

  • 反射式 Web 应用程序 (WebIDE)

    Preamble 所以 这个问题已经得到了解答 但由于这是我对该项目的第一个问题 我将继续在我对该项目提出的其他问题中引用它 对于来自另一个问题的任何人 以下是基本想法 创建一个 Web 应用程序 可以使创建其他 Web 应用程序或网站变得
  • 在 Fortran 中查找数组中满足条件的最小值[索引]

    我正在寻找数组中大于某个数字的最小值 我发现这次讨论我不明白 有MINLOC 但看起来它本身并没有达到我想要的效果 尽管我没有解析给定示例中传递给它的参数 也可以使用循环来完成此操作 但可能很笨拙 你可能想要MINVAL 如果你的数组是这样
  • 在处理程序中创建了一个 Promise,但没有从中返回

    我刚刚开始使用 Bluebird Promise 但遇到了一个令人困惑的错误 代码摘要 var jQueryPostJSON function jQueryPostJSON url data return Promise resolve j
  • D3 Y 轴似乎颠倒了

    我正在尝试根据 CSV 文件中的一些数据生成图表 My code
  • 如何检测 Azure 网站上的 HTTPS 重定向?

    根据标题 我有一个 Node js 应用程序 我希望能够检测请求是通过 HTTPS 还是 HTTP 发出 到目前为止我的重定向看起来像这样 Ensure the page is secure or that we are running a
  • 列表中的数据表

    我已经下载了包含在List
  • Java中如何处理关闭应用程序事件?

    拥有一个控制台应用程序 一个接受来自客户端的多个连接的服务器 是否可以在关闭的应用程序上拥有侦听器或事件 在这种情况下 我希望告诉所有连接的客户端在应用程序真正自行关闭之前轻轻断开连接 有什么解决办法吗 谢谢你 您想使用关闭挂钩 Runti
  • 在Win32中,如何改变STATIC文本的颜色?

    我的窗口上有一些黑色的静态文本 我想在运行时使用颜色选择器对话框更改它 我已经成功获得了颜色 现在我只需要更改文字即可 我读过WM CTLCOLORSTATICmessage 是要处理的消息 尽管这似乎仅适用于控件最初绘制到屏幕上时 可以W
  • 更新 Firebase 多位置并出现错误:路径是路径的祖先。迅速

    当我尝试使用以下命令在多个位置更新数据库时 updateChildValues 我收到下面列出的错误 我怎么解决这个问题 由于未捕获的异常 InvalidFirebaseData 而终止应用程序 原因 updateChildValues 对
  • 自定义单元格模板中带有按钮的 UI-Grid - 如何取消行选择事件?

    我正在使用 ui Grid v 3 0 1 我有一个特定列的自定义单元格模板 它在每行中显示一个按钮 我附加了一个 ng click 属性 它调用 appScope 来触发某些操作 一切都很顺利 但是 单击自定义模板按钮也会导致切换相关行的
  • 未找到基表或视图错误

    产品表 public function up Schema create product function Blueprint table table gt increments id table gt string name table
  • 使用 ionic 3 中的 Angularfire2 从 Firestore 获取集合文档的 ID

    这个问题在这里已经有答案了 我正在尝试获取集合的 id 以在离子页面中使用它 这是我的界面 export interface Item categoryOfPost string imageUrl string nameOfPost str
  • 如何使用 Python 3.x 读取和编辑 Google 电子表格?

    我知道我可以使用以下命令阅读和编辑 Google 电子表格gdata 但没有适用于 Python 3 的 gdata 版本 即使我想使用 Python 3 是否有一种 不是很复杂 的方法来编辑 Google 电子表格 我编写了一个替代方案G
  • 如何在 ffmpeg HLS 中启用 cookie

    有人知道如何在 ffmpeg 中启用 cookie 交互吗 我有一个 HLS 流 需要从服务器保存 cookie 但实际上这不会发生 你可以发送标头与 FFmpeg Linux ffmpeg i INPUT headers Cookie l
  • PyQt QLineEdit 与 QValidator

    我的项目中有一个 QLineEdit 我想在 qlineEdit 上使用验证 Create lineEdit itemValue QtWidgets QLineEdit Create objValidator QtGui QDoubleVa
  • 如何逐步安装和使用 joomla rest api

    请帮忙 我想在 joomla 2 5 中使用 REST api 我在 Github 和 techjoomla 上进行了很多搜索并花了很多天 我不明白如何安装 API 扩展或插件并使用它 即使我没有找到任何正确的文档来使用 API 以及从哪里
  • 使用 XSLT 减少 XML 输出

    如何使用 XSLT 仅从输入 xml 中选择一些 xml 标签到输出 XML 输入示例
  • 设置属性logging.pattern.console或logging.pattern.level时忽略覆盖模式

    使用 spring boot 1 3 2 我试图覆盖 application properties 文件中的 logback 模式 但无论我放入什么模式 总是会调用 spring boot jar xml 中的默认模式 我可以成功调整日志记
  • 如何在docker机器中挂载本地卷

    我正在尝试将 docker machine 与 docker compose 一起使用 文件 docker compose yml 的定义如下 web build command run web sh volumes app ports 8
  • 将标量和数组元素传递给需要数组的过程

    我有一些遗留的 Fortran 77 代码 我试图至少在不发出警告的情况下进行编译 不禁用警告 有些子例程调用会传递一个标量 而子例程需要一个数组 因为标量被用作大小为 1 的数组 所以这不会导致任何问题 但是使用英特尔编译器 如果我启用接