[英]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中創建每次運行都會更改的數組的唯一方法是使數組allocatable
或pointer
。 也有用於本地陣列的自動陣列。
您可以通過這種方式進行分配。 您只需將大小(將其轉換為整數后)傳遞給子例程。 但實際上,我沒有理由不對此類內容使用可分配的數據。
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.