关于Fortran中命令行参数的问题
我有一个关于命令行参数的问题。我知道它们是什么,但我想知道它们是否可以用于子程序或函数。例如,在我的程序中,我通过命令行传递2个值,所以当我运行它时,我键入例如关于Fortran中命令行参数的问题,fortran,command-line-arguments,Fortran,Command Line Arguments,我有一个关于命令行参数的问题。我知道它们是什么,但我想知道它们是否可以用于子程序或函数。例如,在我的程序中,我通过命令行传递2个值,所以当我运行它时,我键入例如 ./main 5,20 是否可以创建从命令行读取值的子例程?或者我必须将它们添加到我的main中,然后将它们传递给我的函数、子例程等?Fortran中可能的功能 是否可以创建从命令行读取值的子例程 在任何程序/函数/子例程中,您都可以调用以下过程:command\u argument\u count()和get\u command\u
./main 5,20
是否可以创建从命令行读取值的子例程?或者我必须将它们添加到我的main中,然后将它们传递给我的函数、子例程等?Fortran中可能的功能 是否可以创建从命令行读取值的子例程 在任何程序/函数/子例程中,您都可以调用以下过程:
command\u argument\u count
()和get\u command\u argument
()
这些将有助于获取命令行参数,但您仍然需要将它们转换为正确的数据类型
或者我必须将它们添加到我的main中,然后将它们传递给我的函数、子例程等
您可以在代码中的任何位置获取它们
最佳实践 即使可以在代码中的任何地方获取/解析命令行参数,但最好在主程序的单独部分中进行。 这一部分应做到以下几点
请注意,您需要用空格而不是逗号分隔参数,例如
./main 5 20
将参数从CLI传递到程序函数如下所示。对数字使用CLI的有用性取决于您的程序必须处理的复杂程度/选项数量:
- 如果它们太多/太复杂,那么我宁愿使用输入文件而不是简单的CLI
- 如果简单的CLI足以满足您的需要,您可以编写一个简单的包装器,将CLI信息预处理为定义良好的Fortran数据结构,然后将其传递到您喜欢的任何地方
- 假设所有CLI输入都是数字
或integer
输入上的数字被发送到两个单独的数组(只是为了说明如何仅在输入时更改功能)real
- 两者都由程序函数单独处理
module simple\u cli
隐式无
私有的
类型,公共::cli\u选项
整数,可分配::a(:)
实的,可分配的::b(:)
包含
过程::销毁=>cli\u销毁
过程::parse=>cli\u parse
过程::nA=>cli\u nA
过程::nB=>cli\u nB
终端类型cli\u选项
包含
! 清除内存
元素子程序cli_destroy(此)
类(cli_选项),意图(inout)::此
如果(已分配(此%a))取消分配(此%a)
如果(已分配(此%b))取消分配(此%b)
结束子例程cli\u destroy
! # “A”项的数量
基本整数函数cli_nA(此)
类(cli_选项),意图(in)::此
cli_nA=合并(大小(此%a)、0、已分配(此%a))
终端功能客户端
! # “B”项的数量
元素整数函数cli_nB(此)
类(cli_选项),意图(in)::此
cli_nB=merge(大小(此%b),0,已分配(此%b))
结束函数cli_nB
! 解析命令行参数
子程序cli_parse(此)
类(cli_选项),意图(out)::此
整数::iArg、nInputArg、nReal、nInteger、strlen、int_值、int_OK、real_OK
real::real_值
字符(1024)::字符串
称之为%destroy()
! 输入参数的数目
nInputArg=命令参数计数();if(nInputArg0)tmp(1:n)=数组
tmp(n+1)=值
调用move_alloc(from=tmp,to=array)
结束子程序real_add
! 填充数组的助手函数(慢!)
纯子例程int_add(数组,值)
整数,可分配,意图(inout)::数组(:)
整数,意图(in)::值
整数,可分配::tmp(:)
整数::n
n=合并(大小(数组)、0、已分配(数组))
分配(tmp(n+1))
如果(n>0)tmp(1:n)=数组
tmp(n+1)=值
调用move_alloc(from=tmp,to=array)
结束子例程int_add
结束模块simple\u cli
程序测试
使用简单的cli
隐式无
类型(cli\u选项)::cli
! 解析命令行参数
调用cli%parse()
! 传递到函数
调用my_函数(cli)
包含
子程序my_函数(选项)
类型(cli_选项),意图(in)::选项
打印*,“我的函数已接收”,选项%nA(),“A”选项:',选项%A(1:选项%nA())
打印*,“我的函数已接收”,选项%nA(),“B”选项:',选项%B(1:选项%nb())
结束子程序my_函数
结束程序测试
程序返回内容的示例:
$ a.exe 1 2.5 3.7 2 45 -125
my_function received 4 "A" options: 1 2 45 -125
my_function received 4 "B" options: 2.50000000 3.70000005
---
$ a.exe dont know
catastrophic CLI error: cannot interpret command <dont>.
$a.exe 1 2.5 3.7 2 45-125
my_功能收到4个“A”选项:1 2 45-125
my_函数收到4个“B”选项:2.50000000 3.7000005
---
$a.exe不知道
灾难性CLI错误:无法解释命令。
你好。非常感谢您的投入。但是如果我将它们放在不同的文件中,而不是主文件中,我如何输入值?我的意思是,例如,我有一个main.f90文件,另一个有函数,我们称之为functions.f90。我通过/main 5 20运行我的程序。现在让我们假设我的函数中有一个子例程。f90需要两个额外的输入。我是否像这样运行它,例如。/main 5 20 10 15?前两个值到我的main,所有4个值到我的子例程?Alex我鼓励你在你的问题中添加这个例子。我将提供一个答案作为对我原始答案的编辑。@Alex我希望
$ a.exe 1 2.5 3.7 2 45 -125
my_function received 4 "A" options: 1 2 45 -125
my_function received 4 "B" options: 2.50000000 3.70000005
---
$ a.exe dont know
catastrophic CLI error: cannot interpret command <dont>.