簡體   English   中英

通過命令行參數設置數組大小

[英]Setting array size from command line arguments

我知道在Fortran中,如果之前將N聲明為parameter (並因此定義為某個值),則可以聲明一個由N個元素組成的數組。

另一方面,我知道我可以使用子例程get_command_arg從命令行接受程序接受參數。

我的問題是:

從命令行調用程序時,能否以某種方式聲明由命令給定的多個元素組成的數組?

我正在尋找類似命令行的內容:

./main -30 

其中main.f03將以類似以下內容的開頭:

integer, parameter :: N = get_command_arg(1)
real :: x(N) ...

我試圖不將數組定義為可分配的。

在某些語言中,您可以從命令行初始化變量和命名常量(例如chapel),但是Fortran並不是其中一種。

您說: “我試圖不將數組定義為可分配的。” 但這就是問題所在。 您只需要。 沒有別的辦法了。

您的密碼

integer, parameter :: N = get_command_arg(1)

real :: x(N) ...

有幾個原因是非法的。

您不能將GET_COMMAND_ARGUMENT()放入常量表達式中,因為它不在允許的函數中。 它不返回編譯時常量值。 並且必須在編譯時設置parameter初始化程序。

GET_COMMAND_ARGUMENT()是子例程,而不是函數。 它可以返回更多的東西,不僅返回值,還返回長度和狀態。 它不是純函數,並且Fortran標准正在嘗試僅使用純函數。 諸如RANDOM_NUMBER()類的其他東西是子例程。 遵循自己的程序也是一種很好的風格。

在Fortran中創建每次運行都會更改的數組的唯一方法是使數組allocatablepointer 也有用於本地陣列的自動陣列。

您可以通過這種方式進行分配。 您只需將大小(將其轉換為整數后)傳遞給子例程。 但實際上,我沒有理由不對此類內容使用可分配的數據。

program main

implicit none

integer :: n,arg_len,istat
character(len=100) :: arg

call get_command_argument(1,value=arg,status=istat)
if (istat/=0) error stop 'error: cannot read first arg'

read(arg,'(I100)',iostat=istat) n
if (istat/=0) error stop 'error: first arg not an integer'

call real_main(n)

contains

    subroutine real_main(n)
    integer,intent(in) :: n
    integer,dimension(n) :: ival
    ival = 1
    write(*,*) ival
    end subroutine real_main

end program main

使用示例:

> ./main 1
       1
> ./main 2
       1           1
> ./main 3
       1           1           1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM