微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在此代码中设置一个数组以具有我不知道的先验维度?

如何解决如何在此代码中设置一个数组以具有我不知道的先验维度?

我有这个程序来打印素数。在第二个子程序中,我必须将数组的大小与我在代码中计算的数字 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 举报,一经查实,本站将立刻删除。