Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Fortran中命令行参数的问题_Fortran_Command Line Arguments - Fatal编程技术网

关于Fortran中命令行参数的问题

关于Fortran中命令行参数的问题,fortran,command-line-arguments,Fortran,Command Line Arguments,我有一个关于命令行参数的问题。我知道它们是什么,但我想知道它们是否可以用于子程序或函数。例如,在我的程序中,我通过命令行传递2个值,所以当我运行它时,我键入例如 ./main 5,20 是否可以创建从命令行读取值的子例程?或者我必须将它们添加到我的main中,然后将它们传递给我的函数、子例程等?Fortran中可能的功能 是否可以创建从命令行读取值的子例程 在任何程序/函数/子例程中,您都可以调用以下过程:command\u argument\u count()和get\u command\u

我有一个关于命令行参数的问题。我知道它们是什么,但我想知道它们是否可以用于子程序或函数。例如,在我的程序中,我通过命令行传递2个值,所以当我运行它时,我键入例如

./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:

    • 假设所有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>.