gpt4 book ai didi

fortran - "Not defined as function or array"编译时

转载 作者:行者123 更新时间:2023-12-04 14:04:44 24 4
gpt4 key购买 nike

我继承了一些旧代码,其中每个函数都定义为一个单独的文件。我正在尝试编写一个简单的程序来测试它。我编写了一个程序 test.f,该程序在其基础上调用 func.f 中的函数,然后报告结果。

使用 ifort -c func.f 我为 func.f 创建了目标文件,然后尝试使用 ifort test.f func.o -o test 进行编译。这给了我 func 未定义为函数或数组的错误。有什么想法吗?

test.f是

      PROGRAM test
REAL :: X,Y
REAL :: FUNC
X = 1.0
Y = func(X)
WRITE(6,*) X
END

而 func.f 是

      FUNCTION func(X)
func = X
RETURN
END

最佳答案

像这样的类型声明语句

real func

声明存在一个名为func 的实体。这可能是:

  • 具有真实结果的函数;或
  • 实型变量

孤立地,仅根据此声明,无法确定 func 是哪种类型的实体。

如果 func 没有被声明为数组,并且在范围内没有对 func 的其他使用,这与它是一个函数不一致,那么 func 被任何可以是函数的引用视为函数,例如

real func
print *, func(1)
end

func 没有数组声明的情况下,任何在范围内与func 函数不一致的func 的使用都将是一个错误。在这种情况下,ifort 通常会发出一条错误消息,看起来像

 error #6410: This name has not been declared as an array or a function.

func 在作用域中的哪些使用会与 func 函数不一致?表达式中几乎所有看起来不像 f(...) 的东西。例如:

  • func 一些属性,一个唯一的变量可能有
  • 在赋值语句中将其用作变量1
  • 提供显式初始化
  • 在需要引用时使用其名称
  • 等等
real :: func      ! Function or variable?
save func ! Function can't be SAVEd
func = 1 ! Function name can't be on the left-hand side
print *, func ! Function name can't be used in an expression
print *, func(1) ! Oops, func isn't a function.

end

(所有这些用法都与数组一致,我们只是没有这样声明它。)

一些类型声明语句使得实体必须是一个变量很明显:

real :: not_func = 1.
real, allocatable :: definitely_variable
real :: definitely_array(5)

end

这就是说:如果您打算使用real func 来声明一个具有隐式接口(interface)和真实结果的外部函数func,但是您会收到关于“not一个数组或函数”,当你试图引用它时,你在某处得到了一些东西,这意味着 func 不是一个函数,你也没有说它是一个数组。

检查所有 func 可能被滥用的情况可能会很无聊,所以让我们的生活更轻松:

real, external :: func

尽管没有 external 属性规范,如果 func 是一个函数,则应用 EXTERNAL 属性,但使用它肯定没有坏处。的确,这很好:通过这种方式我们告诉编译器 func 确实是一个函数。这意味着任何与函数不一致的 func 的使用都是错误,而不是函数引用。

尝试添加了 external 的前面的示例。

您还可以使用接口(interface) block (良好做法)或过程声明语句将 func 准确定义为外部函数。


1 尽管函数引用可以是变量,如

func(1) = 12   ! func a function not an array

只有当函数结果是指针时才会出现这种情况。具有隐式接口(interface)的函数不能有指针结果,因此这种用法与 func 函数不一致。我们还应该避免与语句函数

混淆
real :: func
func(i) = i+1

func函数一致,但它不是别处定义的外部函数。

关于fortran - "Not defined as function or array"编译时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68928903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com