gpt4 book ai didi

arrays - 如何在 Fortran 中声明数组变量及其大小中间例程

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

我想创建一个数组,其维度基于另一个数组中满足特定条件的元素数量。这需要我初始化一个数组中间例程,而 Fortran 不允许我这样做。

有办法解决吗?

例程示例:

subroutine example(some_array)

real some_array(50) ! passed array of known dimension

element_count = 0
do i=1,50
if (some_array.gt.0) then
element_count = element_count+1
endif
enddo

real new_array(element_count) ! new array with length based on conditional statement

endsubroutine example

最佳答案

您的问题不是关于初始化一个数组,这涉及到设置它的值。

但是,有一种方法可以做你想做的事。您甚至可以选择,具体取决于它的通用性。

我假设 element_count 意味着在该循环中有一个 some_array(i)

你可以使 new_array allocatable:

subroutine example(some_array)
real some_array(50)
real, allocatable :: new_array(:)

allocate(new_array(COUNT(some_array.gt.0)))
end subroutine

或将其作为自动对象:

subroutine example(some_array)
real some_array(50)
real new_array(COUNT(some_array.gt.0))
end subroutine

仅当您的条件“简单”时,后者才有效。此外,自动对象不能在模块或主程序的范围内使用。 allocatable 的情况更为普遍,例如当您想要使用完整循环而不是 count 内在变量时,或者希望变量不作为过程局部变量时。

在这两种情况下,您都满足在可执行语句之前拥有所有声明的要求。

自 Fortran 2008 以来,block 构造允许自动对象,即使在可执行语句之后和在主程序中:

program example

implicit none

real some_array(50)
some_array = ...

block
real new_array(COUNT(some_array.gt.0))
end block

end program example

关于arrays - 如何在 Fortran 中声明数组变量及其大小中间例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21046719/

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