2013-06-05 3 views
0

Итак, я пытаюсь закончить часть программы, где мне нужно найти последние n-1 слова в векторной строке и сдвинуть следующее слово в источнике в конец векторной строки. Здесь я пытаюсь написать функцию для «findAndShift» и использовать аргументы из другой программы для ее использования.Аргумент - командные подсказки C++

Это моя часть программы.

void findAndShift(vector<string>& ngram, string source[],int sourceLength) { 
    if (argc == 2)///default command prompt...not declared? 
    { 
     ifstream infile; 
     infile.open(argv[1], ios::in); 
     if (infile.fail()) 
     { 
      cout << argv[0] << ": "<< argv[i] << "I'm afraid I can't let you do that, Dave." << endl; 
     } 
     else 
     { 
      //get length of n 
      infile.seekg(0, ios::end); 
      const int sourceLength = infile.tellg(); 

      int n = 0; 
      string word; 
      ngram = rand() % sourceLength; 
      while (!infile.eof()) 
      { 
       infile >> source; 
       ++n; 
       if(counter == ngram); 
        word = n; 
      } 
     } 
    } 
    return; 
} 

Вот программа, которую я должен использовать для своих.

string source[250000]; 
vector<string> ngram; 
int main(int argc, char* argv[]) { 
    int n, outputN, sl; 
    n = 3; 
    outputN = 100; 
    for (int i = 0; i < argc; i++) { 
     if (string(argv[i]) == "--seed") { 
      srand(atoi(argv[i+1])); 
     } else if (string(argv[i]) == "--ngram") { 
      n = 1 + atoi(argv[i+1]); 
     } else if (string(argv[i]) == "--out") { 
      outputN = atoi(argv[i+1]); 
     } else if (string(argv[i]) == "--help") { 
      help(argv[0]); 
      return 0; } 
    } 
    fillWordList(source,sl); 
    cout << sl << " words found." << endl; 
    cout << "First word: " << source[0] << endl; 
    cout << "Last word: " << source[sl-1] << endl; 
    for (int i = 0; i < n; i++) { 
     ngram.push_back(source[i]); 
    } 
    cout << "Initial ngram: "; 
    put(ngram); 
    cout << endl; 
    for (int i = 0; i < outputN; i++) { 
     if (i % 10 == 0) { 
      cout << endl; 
     } 
     //put(ngram); 
     //cout << endl; 
     cout << ngram[0] << " "; 
     findAndShift(ngram, source, sl); 
    } } 

Любые идеи?

+0

и Что проблеме? – greedybuddha

+0

Это видно только в 'main'. – chris

+0

передать argc в findAndShift как аргумент? –

ответ

0

Вы должны передать больше аргументов в своей программе argc и argv [], поскольку argc является просто параметром для основной функции и, следовательно, не отображается в другой функции.

Вот ваш модифицированный код.

void findAndShift(vector<string>& ngram, string source[],int sourceLength, int argc, char argv[0], argv[1],argv[i]){ 
    if (argc == 2)///default command prompt...not declared? 
    { 
     ifstream infile; 
     infile.open(argv[1], ios::in); 
     if (infile.fail()) 
     { 
      cout << argv[0] << ": "<< argv[i] << "I'm afraid I can't let you do that, Dave." << endl; 
     } 
     else 
     { 
      //get length of n 
      infile.seekg(0, ios::end); 
      const int sourceLength = infile.tellg(); 

      int n = 0; 
      string word; 
      ngram = rand() % sourceLength; 
      while (!infile.eof()) 
      { 
      infile >> source; 
      ++n; 
      if(counter == ngram); 
      word = n; 
      } 
     } 
    } 
    return; 
} 

ваш главный код

string source[250000]; 
vector<string> ngram; 
int main(int argc, char* argv[]) { 
    int n, outputN, sl; 
    n = 3; 
    outputN = 100; 
    for (int i = 0; i < argc; i++) { 
    if (string(argv[i]) == "--seed") { 
     srand(atoi(argv[i+1])); 
    } else if (string(argv[i]) == "--ngram") { 
     n = 1 + atoi(argv[i+1]); 
    } else if (string(argv[i]) == "--out") { 
     outputN = atoi(argv[i+1]); 
    } else if (string(argv[i]) == "--help") { 
     help(argv[0]); 
return 0; } 
    } 
    fillWordList(source,sl); 
    cout << sl << " words found." << endl; 
    cout << "First word: " << source[0] << endl; 
    cout << "Last word: " << source[sl-1] << endl; 
    for (int i = 0; i < n; i++) { 
    ngram.push_back(source[i]); 
    } 
    cout << "Initial ngram: "; 
    put(ngram); 
    cout << endl; 
    for (int i = 0; i < outputN; i++) { 
if (i % 10 == 0) { 
    cout << endl; 
} 
//put(ngram); 
//cout << endl; 
cout << ngram[0] << " "; 
findAndShift(ngram, source, sl, argc,argv[0],argv[1],argv[i]); 
} } 

Я haven''t тестировал. Если он все еще не работает, попробуйте использовать символ * в списке аргументов findAndShift

Надеется, что это помогает ....

Смежные вопросы