我正在使用库中的函数来调用主程序中的(argc,argv)命令行函数直接传递给它;但是,我只想传递一些参数,其余的在主代码中进行评估而不是函数。下面是一个带有评估参数的主代码示例。
int main(int argc,char** argv)
{
// Evaluate arguments
if ( argc > 9 ) {
PrintUsage();
return 1;
}
G4String input;
G4String macro;
G4String physicslist;
for ( G4int i=1; i<argc; i=i+2 ) {
if ( G4String(argv[i]) == "-i" ) macro = argv[i+1];
else if ( G4String(argv[i]) == "-l" ) physicslist = argv[i+1];
else if ( G4String(argv[i]) == "-g" ) input = argv[i+1];
else if //pass the rest of the arguments to function below
G4MPImanager* g4MPI = new G4MPImanager(argc,argv);
上面未评估的任何其他参数我想从外部库传递给函数,这需要如图所示进行调用。
谢谢!
答案 0 :(得分:2)
argv
只是一个由最终NULL
指针终止的char指针数组。您可以使用my_argv = new char *[number_of_items + 1]
创建自己的number_of_items
,其中argv
是您要从“真实”G4MPIManager
(或您自己的字符串)中挑选的参数数量。此类数组可以传递给argv
构造函数,而不是main()
中收到的实际argv
。
附加说明:
不要忘记使用NULL指针终止argv
。
argv[0]
的第一个成员argv[0]
将保留“程序名称”,因此将被忽略或仅用于为诊断消息添加前缀。只需重复使用main()
获得的argc
。
argv[argc] == NULL
应该是number_of_items
,即与上面的argv
相同。鉴于argc
数组必须包含程序名称作为第一个成员,{{1}}将永远不会为0.
答案 1 :(得分:2)
创建一个字符串向量
从矢量中删除不需要的参数
然后,您可以非常轻松地从向量中创建char*[]
(大小非常简单)。
int main(int argc, char* argv[])
{
std::vector<char*> args(argv, argv+argc+1); // +1 to catch the last NULL at argv[argc]
for(auto loop = args.begin(); loop != args.end();)
{
if (/*Your Test 1 */) { /*STUFF 1*/ loop = args.erase(loop);}
else if (/*Your Test 2 */) { /*STUFF 2*/ loop = args.erase(loop);}
else { ++loop; /* If you did not remove it increment loop*/ }
}
// args.size() -1 becuase we have the extra NULL as the last argument.
// and argv[arc] should be null
// &args[0] is the address of the first member.
// vector keeps its data in contiguous memory so will look like an array
G4MPImanager* g4MPI = new G4MPImanager(args.size() - 1, &args[0]);
}
答案 2 :(得分:0)
你必须为你的i
构建一对新的argc和argv,然后将它传递给你的函数。
int newArgc = argc - i;
char** newArgv = &argv[i];
G4MPImanager* g4MPI = new G4MPImanager(newArgc, newArgv);