web-dev-qa-db-fra.com

L'identifiant est indéfini

J'ai écrit le code suivant en C++ en utilisant 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;
}

Je reçois l'erreur identifier "ac_search" is undefined à la fonction invoquant la ligne. Je suis un peu confus ici. parce que la fonction ac_search est déclaré comme un global (pas dans un conteneur). Pourquoi ne puis-je pas l'appeler à cet endroit? Est-ce que je manque quelque chose?

Mise à jour

J'ai essayé d'ignorer le code non pertinent, puis de l'inclure progressivement et d'avoir constaté que tout va bien jusqu'à ce que j'incline la boucle extérieure de ac_search Je reçois l'erreur susmentionnée. Voici le code mis à jour de la fonction 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;
            }
    //    }
    //}
}  

Mise à jour 2

Je pense que l'erreur a quelque chose à voir avec la fonction addWord qui appartient à la classe Trie. Lorsque j'ai commenté cette fonction, je n'ai plus reçu l'erreur.

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

À partir de la mise à jour 2 et après avoir réduit le problème du problème, nous pouvons facilement constater qu'il manque une attelle manquante à la fin de la fonction addWord. Le compilateur n'identifiera jamais explicitement une telle erreur de syntaxe. Au lieu de cela, il supposera que la définition de fonction manquante située dans un autre fichier d'objet. La liaison se plaindre de cela et donc directement sera classée sous l'une des phrases d'erreur générales qui sont identifier is undefined. Raisonnablement, car avec la syntaxe actuelle, la définition de fonction suivante (dans ce cas est ac_search) sera inclus dans la portée addWord. Par conséquent, ce n'est plus une fonction globale. Et c'est pourquoi le compilateur ne verra pas cette fonction à l'extérieur addWord et lancera ce message d'erreur indiquant qu'il n'y a pas de ce type. Une très bonne élaboration sur le compilateur et le lieur se trouvent dans cet ensemble article

2
Hawk