Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran子程序/函数参数名称和声明_Fortran - Fatal编程技术网

Fortran子程序/函数参数名称和声明

Fortran子程序/函数参数名称和声明,fortran,Fortran,我有一些关于Fortran中传递给子程序/函数的参数的一般性问题,特别是当涉及到非局部变量的命名时 鉴于这一主要方案 program xfunc implicit none real, dimension(5) :: var1, var2 integer, var3 ... call my_subroutine(var1(i),var2,var3) SUBROUTINE my_subroutine(arg1,var2,arg3) !inout variable

我有一些关于Fortran中传递给子程序/函数的参数的一般性问题,特别是当涉及到非局部变量的命名时

鉴于这一主要方案

program xfunc
   implicit none
   real, dimension(5) :: var1, var2
   integer, var3
  ...
  call my_subroutine(var1(i),var2,var3)

SUBROUTINE my_subroutine(arg1,var2,arg3)
    !inout variable not matching the var1 declared in main
    real, intent(inout) :: arg1
    !matches the name and dimension of variable in main, is this needed?
    real, intent(inout), dimension(5) :: var2
    !should arg3 be named var3 since it overwrites the values in var3? And should arg3 have a corresponding variable in the main program
    integer, intent(out) :: arg3
    
end my_subroutine
声明中的名称只是标签,对吗?它们不需要匹配主程序中变量的名称。 参数的类型维度也不需要与主程序中的参数匹配,对吗?那么arg1子例程中的数组在inout变量的情况下也可以是实数?它们只需要匹配子例程中的声明?这是否仅适用于意图参数? 即使变量是inout并且与主程序中的变量完全匹配,也需要在子例程中声明变量吗? 命名子例程或函数的参数和变量时有什么好的做法?是否应该使用不同的名称来区分它们与主程序?我对这个问题很好奇,尤其是对于所有输入输出的变量。
1是:实际参数的名称不必与伪参数的名称匹配

2是和否:声明的参数的大小必须至少小于或等于实际参数的大小,而实际参数的大小不是严格精确的…。注意,声明伪参数的维度有几种方式;建议的方法是,它需要一个显式接口:在您的例子中,它允许子例程使用内在的size函数获得确切的大小或参数

3是的,他们需要:意向条款不重要。intentinout仅添加对编译器的检查


4没有一般规则。我的规则是:如果一个子程序在代码中只调用一次或几个call语句,那么通常名称应该匹配。这更容易理解。

1是:实际参数的名称不必与伪参数的名称匹配

2是和否:声明的参数的大小必须至少小于或等于实际参数的大小,而实际参数的大小不是严格精确的…。注意,声明伪参数的维度有几种方式;建议的方法是,它需要一个显式接口:在您的例子中,它允许子例程使用内在的size函数获得确切的大小或参数

3是的,他们需要:意向条款不重要。intentinout仅添加对编译器的检查

4没有一般规则。我的规则是:如果一个子程序在代码中只调用一次或几个call语句,那么通常名称应该匹配。这更容易理解。

这是一个关于参数关联的问题。争论的目的在很大程度上与讨论无关

在过程子例程或函数声明中,标签是将过程作为其作用域的实体的名称。在问题my_子例程的声明中,这些实体的名称为arg1、var2和arg3。这些是过程的伪参数。这些伪参数的名称与其他作用域中的实体名称或多或少是完全无关的,任何与该过程无关的内容。参数意图不影响命名或关联

其他范围内的实体,例如问题的主程序,是不同的东西。但是,当存在过程引用(如子例程调用)时,在引用中的参数(实际参数)和过程本地的实体(伪参数)之间建立了关联。名称不是此关联中的一个因素:实际参数和伪参数不需要具有相同的名称。事实上,不管意图如何,实际参数甚至不需要是名称

在每个作用域主程序中,使用相应的程序名称

作为参数关联的一部分,我们不能简单地说主程序中的参数1与过程中的参数1是相同的。这有很多方面,但我们可以在这里说,这意味着在回答子问题2时:虚拟参数和实际参数通常不需要具有相同的形状,元素的数量或等级。在许多情况下,对形状有限制。意图不是这里的一个因素。在过程内部,伪参数具有其声明的特征,除了可能代替实际参数特征的任何匹配限制之外,都是独立的

此外,可以让数组元素实际参数对应于数组伪参数,而不是标量实际参数。这使用了存储关联,您可以在这里看到许多其他问题

相反,对于非基本过程,数组实际参数不可能与标量伪参数相对应

如果实体不是过程的伪参数,那么必须有其他形式的关联才能获得mai的实体 n程序可在程序范围内访问。这可能是主机关联、使用关联、存储关联或链接关联。在任何情况下,如果没有声明为伪参数,实体就不是伪参数。再一次,意图在这里不起作用

我将不涉及子问题4,这是一个相当主观的问题,只是说,当不同作用域中的实体具有不同的名称时,帮助用户调试有问题的代码要容易得多:函数foo的伪变量x,它是与主程序中实际参数x关联的参数,这是一个关于参数关联的问题。争论的目的在很大程度上与讨论无关

在过程子例程或函数声明中,标签是将过程作为其作用域的实体的名称。在问题my_子例程的声明中,这些实体的名称为arg1、var2和arg3。这些是过程的伪参数。这些伪参数的名称与其他作用域中的实体名称或多或少是完全无关的,任何与该过程无关的内容。参数意图不影响命名或关联

其他范围内的实体,例如问题的主程序,是不同的东西。但是,当存在过程引用(如子例程调用)时,在引用中的参数(实际参数)和过程本地的实体(伪参数)之间建立了关联。名称不是此关联中的一个因素:实际参数和伪参数不需要具有相同的名称。事实上,不管意图如何,实际参数甚至不需要是名称

在每个作用域主程序中,使用相应的程序名称

作为参数关联的一部分,我们不能简单地说主程序中的参数1与过程中的参数1是相同的。这有很多方面,但我们可以在这里说,这意味着在回答子问题2时:虚拟参数和实际参数通常不需要具有相同的形状,元素的数量或等级。在许多情况下,对形状有限制。意图不是这里的一个因素。在过程内部,伪参数具有其声明的特征,除了可能代替实际参数特征的任何匹配限制之外,都是独立的

此外,可以让数组元素实际参数对应于数组伪参数,而不是标量实际参数。这使用了存储关联,您可以在这里看到许多其他问题

相反,对于非基本过程,数组实际参数不可能与标量伪参数相对应

如果实体不是过程的伪参数,那么必须有其他形式的关联才能使主程序的实体在过程范围内可访问。这可能是主机关联、使用关联、存储关联或链接关联。在任何情况下,如果没有声明为伪参数,实体就不是伪参数。再一次,意图在这里不起作用


我将不涉及子问题4,这是一个相当主观的问题,只是说,当不同作用域中的实体具有不同的名称时,帮助用户调试有问题的代码要容易得多:函数foo的伪变量x,它是与主程序中实际参数x关联的参数,在术语中,与bar的模块变量x相关的用法变得有点单调乏味。

您给出的不是一个有效的子程序声明,因此我不完全清楚您在等式的其余部分中的意思。如果您至少提供通话双方和被叫方,这样您就可以清楚地显示您所询问的差异,更好的是提供一个完整的程序,说明您想表达的观点。@IanBush我理解,我试着问一些一般性的问题,但试着添加一些简短的代码来做一些示例。你给出的不是一个有效的子程序声明,因此我不完全清楚你在等式的其余部分中的意思。如果您至少提供通话双方和被叫方,这样您就可以清楚地显示您所询问的差异,更好的是提供一个完整的程序,说明您想表达的观点。@IanBush我理解,我试着问一些基本的问题,但试着添加一些简短的代码来做一些例子。关于2,我认为OP在谈论维度时意味着不同的等级。谢谢你的回答,帮助我理解更多。我指的是秩或大小。通常,子例程或函数会为每个数组施加数组的秩和索引数。但是最近的Fortran没有
rm 2018授权声明具有任意秩的数组。不幸的是,我从未尝试过这种可能性。我只记得一个关于2的声明,我认为OP在谈论维度时意味着不同的等级。谢谢你的回答,帮助我理解更多。我指的是秩或大小。通常,子例程或函数会为每个数组施加数组的秩和索引数。但最近的Fortran规范2018授权声明具有任意秩的数组。不幸的是,我从未尝试过这种可能性。我只记得一个声明,…谢谢你的回答,这肯定有助于更好地理解代码应该如何构造。有一件事我仍然不明白。您提到了意图并没有什么不同,但是子例程如何知道一旦过程完成,示例中arg3的数量需要在var3中写入?var3通过对arg3的更改进行更新是参数关联的关键。但是,一旦过程完成,更改就不会写入var3:在执行过程时,这两个变量本质上是相同的。编译器可能会将其作为带有临时文件的“复制入/复制出”来处理,但这是另一个主题。在这种情况下,您可能会想到按引用传递,而不是按值传递。这两个方面都有微妙之处。因此,即使不使用意图,也可以进行论点关联,对吗?是的。参数关联过程通过其伪参数影响外部世界并受外部世界影响的过程。参数意图主要描述什么类型的效果是可能的。谢谢你的回答,它肯定有助于更好地理解代码应该如何构造。有一件事我仍然不明白。您提到了意图并没有什么不同,但是子例程如何知道一旦过程完成,示例中arg3的数量需要在var3中写入?var3通过对arg3的更改进行更新是参数关联的关键。但是,一旦过程完成,更改就不会写入var3:在执行过程时,这两个变量本质上是相同的。编译器可能会将其作为带有临时文件的“复制入/复制出”来处理,但这是另一个主题。在这种情况下,您可能会想到按引用传递,而不是按值传递。这两个方面都有微妙之处。因此,即使不使用意图,也可以进行论点关联,对吗?是的。参数关联过程通过其伪参数影响外部世界并受外部世界影响的过程。参数意图主要描述可能的效果类型。