本文演示利用OpenFOAM中的argList类为创建的程序构造命令参数。
从提供的argc和argv参数中提取命令参数和选项。如下面的命令执行方式:
program -listFiles \(*.txt\)
命令中,program为命令的名称,listFiles及\(*.txt\)均为命令的参数。本案例的目的即为构造能够携带参数的应用程序。
1 文件准备本案例的文件结构如前面的案例相同。
采用下面的命令创建文件与文件夹。
cd $FOAM_RUNmkdir demo2cd demo2touch demo2.Cmkdir Makecd Maketouch files optionscd ..
文件组织结构如下图所示。
图片
修改files文件的内容demo2.CEXE = demo2修改options文件的内容
EXE_INC = \ -I$(FOAM_SRC)/finiteVolume/lnInclude \ -I$(FOAM_SRC)/meshTools/lnInclude EXE_LIBS = \ -lfiniteVolume \ -lmeshTools2 添加参数
编辑源代码deom2.C,如下所示。
#include <fvCFD.H> int main(int argc, char *argv[]){ // 定义程序的使用说明 argList::addNote( "输入参数:\n" "---------------------\n" "参数1:someWord\n" "参数2:someScalar\n"); // 构建参数 Foam::argList args(argc, argv); return 0;}
这段代码很简单,编译运行如下图所示。
图片
可以看到上面的简单代码为程序添加了帮助文档,可以通过程序名后面带参数-help来查看。
下面继续完善代码,为程序添加两个参数。
#include <fvCFD.H> int main(int argc, char *argv[]){ // 定义程序的使用说明 argList::addNote( "输入参数:\n" "---------------------\n" "参数1:someWord\n" "参数2:someScalar\n"); // 准备参数列表 argList::noParallel(); argList::validArgs.append("someWord"); argList::validArgs.append("someScalar"); Foam::argList args(argc, argv); // 读取参数 const word someWord = args[1]; //第一个参数 //原始程序,新版本将argRead函数废弃了,改用get函数 // const scalar someScalar = args.argRead<scalar>(2); const scalar someScalar = args.get<scalar>(2); //第二个参数 Info << "获取参数:" << endl << "someWord:" << someWord << endl << "someScalar:" << someScalar << endl; return 0;}
编译运行如下图所示。
图片
提示需要输入两个参数。将运行命令改成./demo2 hello 2,如下图所示,可以看到程序顺利运行。
图片
3 添加选项可以为程序添加可选参数。如下代码。
#include <fvCFD.H> int main(int argc, char *argv[]){ // 定义程序的使用说明 argList::addNote( "输入参数:\n" "---------------------\n" "参数1:someWord\n" "参数2:someScalar\n"); // 准备参数列表 argList::noParallel(); argList::validArgs.append("someWord"); argList::validArgs.append("someScalar"); // 增加一个选项参数,调用方式为-dict word // 参数依次为:选项名、参数、使用说明 argList::addOption( "dict", "word", "额外的字典路径(非当前路径):"); // 增加一个布尔选项,调用形式为-someSwitch argList::addBoolOption( "someSwitch", "从A切换到B"); // 增加一个整数选项,调用形式为-someInt label argList::addOption( "someInt", "label" "可选整数"); // 创建一个参数对象args Foam::argList args(argc, argv); // 读取参数someWord及someScalar const word someWord = args[1]; //第一个参数 const scalar someScalar = args.get<scalar>(2); //第二个参数 // 输出参数信息 Info << "获取参数:" << endl << "someWord:" << someWord << endl << "someScalar:" << someScalar << endl; // 读取选项-dict的信息 fileName dictPath("defaultDict"); if (args.found("dict")) { args.readIfPresent("dict", dictPath); Info << "获取一个字典路径" << nl; } Info << "从字典文件:[" << dictPath << "]中读取字典" << endl; // 读取布尔选项信息,并输出信息 const bool someConstBool = args.found("someSwitch"); Info << "开关设置为:" << someConstBool << endl; // 读取整x选项参数并输出参数值 label someInt(0); args.readIfPresent("someInt", someInt); Info << "整数选项值:" << someInt << endl; Info << "-------End-------" << endl; return 0;}
注意参数是必选的,可选参数可以不选。
编译后输入下面的命令./demo2 hello 2 -dict defaultDict1 -someSwitch -someInt 2,运行如下图所示。这里命令参数是随便输入的,仅为演示。
图片
注意可选参数可以不选,如下面的命令./demo2 hello 2 -dict defaultDict1 -someSwitch。
图片
而且可选参数的位置可以随意调换,如下图为命令./demo2 hello 2 -dict defaultDict1 -someInt 3 -someSwitch的运行结果。
图片
可选参数还可以放到必选参数的前面,如运行命令./demo2 -someInt 3 hello 3,结果如下图所示。
图片
注意,源文件中读参数函数已经修改为最新OpenFOAM所支持的函数,被替换的函数如下表所示。
老版本函数(被废弃)新版本函数optionFoundfoundoptionReadIfPresentreadIfPresent被废弃的函数目前依然可以使用,只是在编译过程中会有警告信息,不建议使用老版本函数,除了更复杂以外,还很有可能在未来更高的版本中被彻底放弃。
(本文程序在OpenFOAM 2112下运行通过。在V9版本下需要进行小幅修改。强烈建议手撸代码,因此文中的源代码就不提供了。)
(完毕)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。