Identificatiecode is niet gedefinieerd

Ik heb de volgende code in C++ geschreven met VS2012 Express.

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;
}

Ik krijg de foutmelding identifier "ac_search" is undefinedbij de functie die de regel oproept. Ik ben een beetje in de war hier. omdat de functie ac_searchis gedeclareerd als een globale (niet in een container). Waarom kan ik het hier niet noemen? Mis ik iets?

Bijwerken

Ik probeerde irrelevante code te negeren en voegde het geleidelijk toe en ontdekte dat alles in orde was totdat ik de buitenste lus van ac_searchopnam. Ik krijg de bovengenoemde fout. hier is de bijgewerkte code van de functie 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;
            }
    //    }
    //}
}  

Update 2

Ik denk dat de fout iets te maken heeft met de functie addWorddie tot de klasse Triebehoort. Toen ik een opmerking maakte over deze functie, kreeg ik de fout niet meer.

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;
    }

Antwoord 1, Autoriteit 100%

Vanaf de update 2 en na het versmalend van de probleemscope, kunnen we gemakkelijk vinden dat er een beugel ontbreekt aan het einde van de functie addWord. De compiler zal nooit expliciet een dergelijke syntaxisfout identificeren. In plaats daarvan gaat het ervan uit dat de ontbrekende functiedefinitie zich in een ander objectbestand bevindt. De linker klagen erover en daarom wordt rechtstreeks gecategoriseerd onder een van de brede de foutzinnen die identifier is undefined. Redelijk, omdat met de huidige syntaxis de volgende functiedefinitie (in dit geval ac_search) wordt opgenomen onder de addWordTOEPASSING. Daarom is het geen wereldwijde functie meer. En daarom ziet de compiler deze functie niet buiten addWorden gooide dit foutbericht waarin staat dat er geen functie is. Een zeer goede uitwerking over de compiler en de linker is te vinden in deze artikel


Antwoord 2, Autoriteit 12%

Mont u een functieaangifte?

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);

Voeg deze toe vlak voor uw implementatie van AC_BENCHMARK_SEARCH.


Antwoord 3

Mogelijk mist u ook using namespace std;

Other episodes