如何解决如何在此代码中设置一个数组以具有我不知道的先验维度?
我有这个程序来打印素数。在第二个子程序中,我必须将数组的大小与我在代码中计算的数字 k 相等,但我不知道该怎么做,因为一开始,当我声明 numeri 时,我已经必须输入他的维度。我该怎么做?
program primi
implicit none
integer,parameter :: a=10
integer:: i,k
logical,dimension(a):: logi
integer,dimension(10) :: numeri
call sieve(logi,a)
print *,logi
k=0
do i=1,size(logi)
if (logi(i)) then
k=k+1
end if
end do
print *,k
call logical_to_integer(numeri,logi,10,numeri
end program primi
subroutine sieve(is_prime,n_max)
integer,intent(in) :: n_max
logical,intent(out) :: is_prime(n_max)
integer :: i
is_prime = .true.
is_prime(1) = .false.
do i = 2,int(sqrt(real(n_max)))
if (is_prime (i)) is_prime (i * i : n_max : i) = .false.
end do
return
end subroutine
subroutine logical_to_integer(prime_numbers,is_prime,num_primes,n)
! =====================================================
! Translates the logical array from sieve to an array
! of size num_primes of prime numbers.
! =====================================================
integer :: i,j=0
integer,intent(in) :: n
logical,intent(in) :: is_prime(n)
integer,intent(in) :: num_primes
integer,intent(out) :: prime_numbers(num_primes)
do i = 1,size(is_prime)
if (is_prime(i)) then
j = j + 1
prime_numbers(j) = i
end if
end do
return
end subroutine
解决方法
我知道您需要数组 ['a3','b3','c3']
在运行时可分配。
有一种在 Fortran90 中声明可分配数组的特定方法,numeri
(此处 integer,dimension(:,:),allocatable :: x
只是一个矩阵示例)。
通过使用命令 x
,如上所述声明矩阵 x
使其可在运行时分配。
我还检测到一些应该在您的子例程中声明为 allocate(x(first_dim,second_dim))
的参数,它不会导致错误,但仍然是一种很好的做法。
同样按照 Ian Bush 的建议,您可以使用函数 inout
来定义 Count
。
这是您程序的工作版本,从范围 (1,100] 中选取质数:
k
输出:
program primi
implicit none
integer,parameter :: a=100
integer :: k
logical,dimension(a) :: logi
integer,dimension(:),allocatable :: numeri ! declare this as a dynamic array
call sieve(logi,a)
print *,logi
k = Count( logi ) ! as suggested in the comments
print *,k
allocate(numeri(k)) ! now allocate the array
call logical_to_integer(numeri,logi,k,a) ! inout parameter
print *,numeri
stop
end program primi
subroutine sieve(is_prime,n_max)
integer,intent(in) :: n_max
logical,intent(inout) :: is_prime(n_max)
integer :: i
is_prime = .true.
is_prime(1) = .false.
do i = 2,int(sqrt(real(n_max)))
if (is_prime(i)) then
is_prime(i * i : n_max : i) = .false.
end if
end do
return
end subroutine
subroutine logical_to_integer(prime_numbers,is_prime,num_primes,n)
! =====================================================
! Translates the logical array from sieve to an array
! of size num_primes of prime numbers.
! =====================================================
integer :: i,j
integer,intent(in) :: n
logical,intent(in) :: is_prime(n)
integer,intent(in) :: num_primes
integer,intent(inout) :: prime_numbers(num_primes) ! inout parameter
j = 0
do i = 1,size(is_prime)
if (is_prime(i)) then
j = j + 1
prime_numbers(j) = i
end if
end do
return
end subroutine
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。