2014-09-06 3 views
0

전달할 주 프로그램에서 (argc, argv) 명령 행 함수를 호출하는 라이브러리에서 함수를 사용하고 있습니다. 직접 그것에; 그러나, 나는 나머지 코드를 함수가 아닌 메인 코드에서 평가하면서 일부 인수 만 전달하려고합니다. 다음은 인수를 평가하는 주 코드의 샘플입니다.C++에서 main (argv, argc) 함수로 (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

이것은 코드 섹션을 통해 잘 생각되지만 실제로 질문하지 않았습니다. "-i", "-l"및 "-g"가 아닌 모든 인수 또는 다음 인수를 감지 할 수있는 방법을 찾고 있습니까? – chrisb2244

+2

'getopt' 나'argp' [GNU libc] (http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html#)와 같은 표준 프로그램 인수 구문 분석 기법을 사용해야합니다. 구문 분석 프로그램 인수). GNU 협약에 따라 일반적인'--help'와'--version' 인자를 받아들이는 것은 매우 유용합니다. 그러면 라이브러리가'argc' +'argv' 인수를 만들 수 있습니다 ('argv [argc]'는'NULL'이어야합니다). –

답변

2

argv은 단순히 NULL 포인터로 끝나는 char 포인터의 배열입니다. my_argv = new char *[number_of_items + 1]을 사용하여 직접 만들 수 있습니다. number_of_items은 "진짜"argv (또는 자신의 문자열)에서 체리 선택하려는 인수의 개수입니다. 이러한 배열은 에 수신 된 argv 실제 대신에 G4MPIManager 생성자로 전달 될 수 있습니다.

추가 참고 :

  • 는 NULL 포인터로 argv을 종료하는 것을 잊지 마십시오.

  • argv의 첫 번째 구성원 인 argv[0]은 "프로그램 이름"을 보유 할 것으로 예상되며 진단 메시지의 접두사로 사용되거나 무시됩니다. argv[0]을 다시 사용하기 만하면 main()에 도착합니다.

  • argcargv[argc] == NULL, 즉 상기 number_of_items과 같아야합니다. argv 배열의 첫 번째 구성원으로 프로그램 이름을 포함해야합니다 감안할 때, argc 당신은 당신의 i가 무엇 이건는 argc와 argv를의 새로운 쌍을 구성하고 함수에 전달해야 0

+0

'argc'는 0이 될 수 있지만 POSIX는 프로그램이 어떻게 호출되었는지를 나타 내기 위해 첫 번째 인수를 요구합니다 . 나는'number_of_items'가 결코 0이 될 수 없다는 것을 의미한다고 생각합니다. – Potatoswatter

+0

다른 방법으로 프로그램이'main()'에 전달되는'argv' 아이템을 '소비'한다면'argv'의 나머지 항목을 아래로 움직여서 제거 할 수 있습니다.argc (물론)에서 제거를 설명하고 argv [argc]를 NULL로 설정하는 것을 잊지 마십시오. –

+0

@Potatoswatter 제 대답의 표현은 정확하지 않았습니다. argv/argc 쌍을 생성 할 때 'argc'가 0이 아니거나'main()'에 전달 된 것을 흉내내는 argv/argc 쌍은 'argv [argc] == NULL' 불변 식을 따르지 않으며, 다른 말로". 나는 그것에 대해 더 명확하게 대답을 되 새겼다. – user4815162342

0

수 없을 것입니다.

int newArgc = argc - i; 
char** newArgv = &argv[i]; 
G4MPImanager* g4MPI = new G4MPImanager(newArgc, newArgv); 
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]); 
} 
관련 문제