2013-11-25 22 views
0

目前我分析下面的構造函數:問題的理解ARGLIST構造器

Foam::argList::argList 
372 (
373  int& argc,  // argc of main 
374  char**& argv, // argv of main 
375  bool checkArgs, 
376  bool checkOpts 
377 ) 
378 : //Initializing 
379  args_(argc), //stringList args_ with size argc       
380  options_(argc) //HashTable<string> options_ with size argc 
381 { 
382  // Check if this run is a parallel run by searching for any parallel option 
383  // If found call runPar which might filter argv 
384  for (int argI = 0; argI < argc; ++argI) 
385  { 
386  if (argv[argI][0] == '-') //argv is array of pointers //HERE 
387  {       //inline const Foam::string& Foam::argList::operator[] 
           //(const label index) const 
           //{ 
           //return args_[index]; 
           //} 

388  const char *optionName = &argv[argI][1]; //Adressenzuordnung 
389  
390  if (validParOptions.found(optionName)) 
391  { 
392  parRunControl_.runPar(argc, argv); 
393  break; 
394  } 
395  } 
396  } 

我有一個關於線386問題:

argv的應該是給定的參數主(指針數組... )。用argv [argI],我訪問argv的argI元素,並用[0]調用重載的運算符method []。我真的不知道這裏發生了什麼,也許我錯誤地解釋了一些事情?

問候 streight

+0

它不是一個指針數組。這顯然是一個指向聲明指針的指針。只是你可以索引一個指針(實際上,你不能索引一個數組本身)。 – chris

+0

@chris:如果我看一下char * argv []的一般定義,我認爲它是一個指針數組。此外,在許多教程中,它也被描述爲一系列的指標。 – Streight

+0

你的函數需要一個'char **&',而不是'char * []',但這不重要,因爲看起來像數組的參數實際上是指針。 – chris

回答

1

至於你提到的argv是一個char **。 argv [x] [y]表示第x個指針的第y個元素。更具體地說,該行的要點是檢查命令行參數是否以破折號開頭。它與運算符重載無關,它是一個指針數組的簡單訪問。

讓我們看一個例子:

./a.out -bar -foo baz 32 -3 

所有命令行參數的條件檢查,如果他們以劃線開頭。所以,對於-bar,-foo,-3這是真的,但對於baz和32不是。

+0

所以if條件是檢查我們是否已經達到命令行參數中的程序之後的第一個參數? – Streight

+0

我給我的答案添加了一個例子。我希望現在很清楚。 – Paul92