Я знаю, как получить простые аргументы командной строки Fortran с помощью функции GET_COMMAND_ARGUMENT() следующим образом:
program silly_app
character(len=10) :: arg
integer :: i, x
do i = 1, command_argument_count()
call GET_COMMAND_ARGUMENT(i, arg)
select case (arg)
case ('-s', '--SA')
x = 0
case ('-f', '--FEWS')
x = 1
end select
enddo
end program
Однако я хочу добиться анализа аргумента через командную строку и прочитать строку после этого определенного аргумента. Программа должна называться так:
silly_app.exe -f -p "C:\TEMP\"
где аргумент -p заставляет программу считывать аргумент «C:\TEMP» в переменную, которая используется внутри программы.
У меня возникли трудности с тем, как вызвать чтение строки с помощью аргумента «-p» и не вызвать ее с помощью аргумента «-x».
Если вы знаете, что аргумент 2 — это -p, то вы знаете, что аргумент 3 — это строка, которую вы хотите прочитать, не так ли? И если аргумент 4 равен -x, то вы (обязательно) не хотите читать аргумент 5 как строку?
Значит, мне нужно прочитать все аргументы, а затем после прочтения присвоить их внутренним переменным? Это правильно?





Когда у вас есть цикл типа
do i = 1, command_argument_count()
end do
вы говорите, что ожидаете выполнить тело цикла количество раз, равное результату command_argument_count() (количество аргументов в командной строке). Конечно, это один из способов сделать что-то.
Но на самом деле лучше считать, что количество итераций неизвестно заранее. В конце концов, вы можете рассматривать два (или более) аргумента как набор. Например, -p string быть парой.
Это цикл с неопределенным количеством итераций1:
i=0
do
i=i+1
if (i.gt.command_argument_count()) exit
end do
Сформулировав это таким образом, мы можем сказать:
character(:), allocatable :: arg, pstr ! For F2023 get_command_argument
integer i
i=0
do
i=i+1
if (i.gt.command_argument_count()) exit
call get_command_argument(i, arg)
if (arg=='-p') then
i=i+1
call get_command_argument(i, pstr)
end if
end do
Это можно многое привести в порядок, можно написать с помощью select case и обработать другие параметры. Символы отложенной длины хороши, но вам, возможно, придется использовать их немного иначе, чем показано здесь.
Ответы на этот другой вопрос тоже дают хорошие советы.
1 Напомним, что в цикле с управляющей переменной, например do i=..., мы не можем пропустить итерацию, увеличивая управляющую переменную внутри тела цикла. Вот почему i здесь обрабатывается более громоздким способом.
Какой аспект вызывает у вас затруднения? Например, как прочитать строку, как получить следующий аргумент или что-то еще?