【问题标题】:Simple program: squared module of a vector [duplicate]简单程序:向量的平方模
【发布时间】:2019-09-03 21:37:29
【问题描述】:

我正在为向量的平方模编写一个简单的程序,你能帮帮我吗?

对于 fortran 2008 的初学者,我没有发现任何有用的东西,尤其是在数组之间的这些简单操作中。

function squared_module(n)
integer :: module2
integer, dimension(3), intent(in) :: n
module2=n(1)**2+n(2)**2+n(3)**2
end function

program propagator

implicit none

integer, dimension(3) :: m
integer :: module2

write (*,*) "Give me a vector"
read (*,*) m

module2=squared_module(m)

print*, "Module squared is ", module2

end program propagator

我得到的错误:

传播者.f08:38:26:

 module2=squared_module(m)
                      1

错误:函数“squared_module”在 (1) 处的返回类型不匹配 (UNKNOWN/REAL(4)) 传播者.f08:38:12:

 module2=squared_module(m)
        1

错误:(1) 处的函数“squared_module”没有隐式类型

【问题讨论】:

  • 请注意,您的函数squared_module 可以替换为对内部例程dot_product 的调用,例如dot_product(m,m)
  • 这里有两个问题:1)函数没有被声明需要(因为implicit none)——你可以使用显式(更好)或隐式接口来做到这一点; 2)您没有正确定义函数结果(您定义了一个局部变量module2,而不是正确的函数结果squared_module。这些重复的问题解决了它们之间的每一点。

标签: arrays fortran operation


【解决方案1】:

你有两个选择。您可以在函数声明中添加module2 作为结果变量。

function squared_module(n) result(module2)

你可以将函数重写为

function squared_module(n)
   integer :: squared_module
   integer, dimension(3), intent(in) :: n
   squared_module=n(1)**2+n(2)**2+n(3)**2
end function

【讨论】:

  • 这是正确的,但没有解决问题的要点:在主程序中没有函数squared_module 的声明。没有正确定义函数结果是相关的,但不是重点。
  • @francescalus 我可以修改什么?我是初学者,你能正确地写给我吗?谢谢!
  • @fransecalus,是的,我错过了implicit 声明错误。 OP 可以通过在主程序中添加integer, external :: squared_module 来解决这个问题。
猜你喜欢
  • 2017-05-19
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多