gpt4 book ai didi

syntax - Fortran 传递带括号的参数可防止更改

转载 作者:行者123 更新时间:2023-12-04 22:57:01 25 4
gpt4 key购买 nike

在此 question我询问了一种明确防止传递的参数更改的方法。一个明显的解决方案是定义参数的副本并在这些副本上运行算法。但是,在评论中,我指出了一个事实,即我可以调用该函数并将我不想在括号中更改的参数包装起来。这与创建传递的变量的副本具有相同的效果,因此它不会更改。但我不明白它是如何工作的以及括号实际上在做什么。所以有人可以给我解释一下吗?

这是一个简单的例子,其中的行为发生如我所描述的。

  1 program argTest                                                                 
2 implicit none
3 real :: a, b, c
4
5 interface !optional interface
6 subroutine change(a,b,c)
7 real :: a, b, c
8 end subroutine change
9 end interface
10
11 write(*,*) 'Input a,b,c: '
12 read(*,*) a, b, c
13
14 write(*,*) 'Values at start:'
15 write(*,*)'a:', a
16 write(*,*)'b:', b
17 write(*,*)'c:', c
18
19
20 call change((a),b,c)
21 write(*,*)'Values after calling change with brackets around a:'
22 write(*,*)'a:', a
23 write(*,*)'b:', b
24 write(*,*)'c:', c
25
26
27 call change(a,b,c)
28 write(*,*)'Values after calling change without brackets:'
29 write(*,*)'a:', a
30 write(*,*)'b:', b
31 write(*,*)'c:', c
32
33 end program argTest
34
35
36 subroutine change(a,b,c)
37 real :: a, b, c
38
39 a = a*2
40 b = b*3
41 c = c*4
42
43 end subroutine change
44
45
46

最佳答案

语法 (a) ,在问题代码的上下文中,是一个表达式。在没有指针结果的情况下,对表达式求值以产生一个值。在这种情况下,表达式的值与变量 a 的值相同。 .

而表达式 (a) 的计算结果,以及变量 a ,具有相同的值,它们不是同一个东西——变量的值与变量本身不是同一个概念。这在某些情况下使用,其中需要提供相同的变量作为输入参数和单独的输出参数,否则会违反 Fortran 对参数别名的限制。

然而 - 如上所述 - 在没有指针结果的情况下,计算表达式的结果是一个值,而不是一个变量。 不允许重新定义值 .从概念上讲,说“我将改变值 2 的含义”或“我将改变计算结果 1 + 1”的含义是没有意义的。

当您使用这样的表达式作为实际参数时,它不能与在过程中重新定义的虚拟参数相关联。

子程序内部change ,与表达式 (a) 的值相关联的虚拟参数被重新定义。这是不符合的。

是否制作副本是您不能(也不能)指望的实现细节 - 链接问题中的评论不准确。例如,知道上述限制的编译器知道子例程 change。实际上不能以一致的方式改变第一个参数,可能知道 a否则对 change 不可见,因此决定不需要制作 a 的临时副本。为表达结果。

如果您需要制作某事物的临时副本,请编写制作副本的语句。

real :: tmp_a
...
tmp_a = a
call change(tmp_a, b, c)

关于syntax - Fortran 传递带括号的参数可防止更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40700499/

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