Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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中,参数属性是在运行时还是编译时设置的? 我想知道是否可以在运行时传入数组的大小,并将其设置为参数 这能做到吗?如果是,怎么做?如果没有,原因是什么?参数的值在编译时设置 声明,如 integer, parameter :: number_of_widgets = numwidge 要求numwidge在编译时已知,实际上在声明的rhs上遇到它之前就已知。在编译时设置参数的值 声明,如 integer, parameter :: number_of_widgets = numw

在Fortran中,
参数
属性是在运行时还是编译时设置的? 我想知道是否可以在运行时传入数组的大小,并将其设置为
参数


这能做到吗?如果是,怎么做?如果没有,原因是什么?

参数的值在编译时设置

声明,如

integer, parameter :: number_of_widgets = numwidge

要求
numwidge
在编译时已知,实际上在声明的rhs上遇到它之前就已知。

在编译时设置
参数的值

声明,如

integer, parameter :: number_of_widgets = numwidge

要求
numwidge
在编译时已知,实际上在声明的rhs上遇到它之前就知道了。

如果要将数组的大小定义为运行时,则需要动态分配。所有参数(常量)必须定义为编译时间。

如果要将数组的大小定义为运行时,则需要动态分配。所有参数(常量)必须定义为编译时。

是的,正如反复回答的那样,命名常量(具有
参数
属性的对象)的初始值必须为“编译时已知”。但是,在讨论数组的大小时,我会注意到一些其他内容

当声明数组的形状时,很多时候边界不需要由常量表达式给出(其中一个简单的命名常量就是一个例子)。因此,在主程序或模块中

implicit none
...
integer, dimension(n) :: array  ! Not allowed unless n is a named constant.
end program
n
必须是常数。但是,在许多其他上下文中,
n
只需要是一个规范表达式

implicit none
integer n

read(*,*) n
block
  ! n is valid specification expression in the block construct
  integer, dimension(n) :: array1
  call hello(n)
end block

contains

  subroutine hello(n)
    integer, intent(in) :: n  ! Again, n is a specification expression.
    integer, dimension(2*n) :: array2
  end subroutine

end program
也就是说,
array1
array2
是显式形状自动对象。出于许多目的,实际上并不需要命名常量

但是,除了数组大小之外,肯定不允许出现以下情况

implicit none
integer n, m

read(*,*) n, m
block
  ! n and m are specifications expression in the block construct
  integer(kind=m), dimension(n) :: array  ! But the kind needs a constant expression.
  ...
end block

是的,正如反复回答的那个样,命名常量(具有
参数
属性的对象)的初始值必须是“编译时已知的”。但是,在讨论数组的大小时,我会注意到一些其他内容

当声明数组的形状时,很多时候边界不需要由常量表达式给出(其中一个简单的命名常量就是一个例子)。因此,在主程序或模块中

implicit none
...
integer, dimension(n) :: array  ! Not allowed unless n is a named constant.
end program
n
必须是常数。但是,在许多其他上下文中,
n
只需要是一个规范表达式

implicit none
integer n

read(*,*) n
block
  ! n is valid specification expression in the block construct
  integer, dimension(n) :: array1
  call hello(n)
end block

contains

  subroutine hello(n)
    integer, intent(in) :: n  ! Again, n is a specification expression.
    integer, dimension(2*n) :: array2
  end subroutine

end program
也就是说,
array1
array2
是显式形状自动对象。出于许多目的,实际上并不需要命名常量

但是,除了数组大小之外,肯定不允许出现以下情况

implicit none
integer n, m

read(*,*) n, m
block
  ! n and m are specifications expression in the block construct
  integer(kind=m), dimension(n) :: array  ! But the kind needs a constant expression.
  ...
end block

所以我可以这样做:
INTEGER,PARAMETER(n=variable)
其中
variable
是从输入文件读取的值吗?@kirikoumath,前提是
variable
也是常量。@AlexanderVogt我如何定义从输入文件读取的常量变量?@你不能。(至少在运行时)。但是,您可以使用预处理器来定义
变量
@AlexanderVogt我错过了chapel中的
配置常量
配置参数
。所以我可以这样做:
整数,参数(n=variable)
where
variable
是从输入文件读取的值吗?@kirikoumath仅当
variable
也是常量时才使用。@AlexanderVogt如何定义从输入文件读取的常量变量?@您不能。(至少在运行时)。但是,您可以使用预处理器来定义
变量
@AlexanderVogt我错过了chapel中的
配置常量
配置参数
。@kirikoumath,我很乐意提供帮助。记住接受答案,这样有同样问题的人就可以很容易地找到答案。如果你还有其他问题,尽管问。@kirikumath,我很乐意帮忙。记住接受答案,这样有同样问题的人就可以很容易地找到答案。如果您还有其他问题,请提问。我不知道有什么更好的标题,但请注意,带有
参数
属性的东西绝不是变量。我不知道有什么更好的标题,但请注意,带有
参数
属性的东西绝不是变量。