web-dev-qa-db-ja.com

識別子は未定義です

VS2012 Expressを使用してC++で次のコードを記述しました。

void ac_search(
    uint num_patterns, uint pattern_length, const char *patterns, 
    uint num_records, uint record_length, const char *records,
    int *matches, Node* trie) {

  // Irrelevant code omitted.
}    

vector<int> ac_benchmark_search(
    uint num_patterns, uint pattern_length,
    const char *patterns, uint num_records, uint record_length,
    const char *records, double &time) {

  // Prepare the container for the results
  vector<int> matches(num_records * num_patterns);
  Trie T;
  Node* trie = T.addWord(records, num_records, record_length);

  // error line
  ac_search(num_patterns, pattern_length, patterns, num_records,
            record_length, records, matches.data(), trie);    

  // Irrelevant code omitted.    
  return matches;
}

関数呼び出し行でエラーidentifier "ac_search" is undefinedが発生します。ここでは少し混乱しています。関数ac_searchがグローバルとして宣言されているためです(コンテナー内ではありません)。なぜ私はこの場所でそれを呼ぶことができないのですか?何か不足していますか?

更新

私は無関係なコードを無視してみて、徐々にそれを含めてみましたが、ac_searchの外側のループを含めるまではすべて問題なく、前述のエラーが発生しました。これは関数ac_searchの更新されたコードです:

void ac_cpu_string_search(uint num_patterns, uint pattern_length, const char *patterns, 
                       uint num_records, uint record_length, const char *records, int *matches, Node* trie)
{
    // Loop over all records
    //for (uint record_number = 0; record_number < num_records; ++record_number)
    //{
    //    // Loop over all patterns
        for (uint pattern_number = 0; pattern_number < num_patterns; ++pattern_number)
        {
            // Execute string search
            const char *ptr_record = &records[record_number * record_length];
            const char *ptr_match = std::strstr(ptr_record, &patterns[pattern_number * pattern_length]);

            // If pattern was found, then calculate offset, otherwise result is -1
            if (ptr_match)
            {
                matches[record_number * num_patterns + pattern_number] = static_cast<int>(std::distance(ptr_record, ptr_match));
            }
            else
            {
                matches[record_number * num_patterns + pattern_number] = -1;
            }
    //    }
    //}
}  

更新2

エラーはクラスaddWordに属する関数Trieに関係していると思います。この関数をコメント化したところ、エラーは発生しなくなりました。

Node* Trie::addWord(const char *records, uint num_records, uint record_length)
{

    // Loop over all records
    for (uint record_number = 0; record_number < num_records; ++record_number)
    {
        const char *ptr_record = &records[record_number * record_length];
        string s = ptr_record;
        Node* current = root;
        if ( s.length() == 0 )
        {
            current->setWordMarker(); // an empty Word
            return;
        }

        for ( int i = 0; i < s.length(); i++ )
        {        
            Node* child = current->findChild(s[i]);
            if ( child != NULL )
            {
                current = child;
            }
                else
                {
                    Node* tmp = new Node();
                    tmp->setContent(s[i]);
                    current->appendChild(tmp);
                    current = tmp;
                }
                if ( i == s.length() - 1 )
                    current->setWordMarker();
        }
        return current;
    }  

void ac_search(
        uint num_patterns, uint pattern_length, const char *patterns, 
        uint num_records, uint record_length, const char *records,
        int *matches, Node* trie) {

      // Irrelevant code omitted.
    }    

    vector<int> ac_benchmark_search(
        uint num_patterns, uint pattern_length,
        const char *patterns, uint num_records, uint record_length,
        const char *records, double &time) {

      // Prepare the container for the results
      vector<int> matches(num_records * num_patterns);
      Trie T;
      Node* trie = T.addWord(records, num_records, record_length);

      // error line
      ac_search(num_patterns, pattern_length, patterns, num_records,
                record_length, records, matches.data(), trie);    

      // Irrelevant code omitted.    
      return matches;
    }
3
Hawk

アップデート2から問題の範囲を絞り込んだ後、関数addWordの末尾にブレースがないことが簡単にわかります。コンパイラはそのような構文エラーを明示的に識別しません。代わりに、不足している関数定義が他のオブジェクトファイルにあると想定します。リンカはそれについて文句を言うので、identifier is undefinedという広範なエラーフレーズの1つに直接分類されます。合理的には、現在の構文では次の関数定義(この場合はac_search)がaddWordスコープの下に含まれるためです。したがって、それはもはやグローバル関数ではありません。コンパイラがaddWordの外でこの関数を認識せず、そのような関数がないことを示すこのエラーメッセージをスローするのはそのためです。コンパイラとリンカに関する非常に優れた詳細は、この article にあります。

2
Hawk

関数宣言がありませんか?

void ac_search(uint num_patterns, uint pattern_length, const char *patterns, 
               uint num_records, uint record_length, const char *records, int *matches, Node* trie);

Ac_benchmark_searchの実装の直前に追加します。

0
user1764961