Bezeichner ist nicht definiert

Schrieb ich den folgenden code in C++ unter Verwendung von 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;
}

Bekomme ich die Fehlermeldung identifier "ac_search" is undefined den function-Aufruf-Zeile. Ich bin ein bisschen verwirrt hier. da die Funktion ac_search ist deklariert als Globale (nicht in einem container). Warum kann nicht ich nenne es an dieser Stelle? Bin ich etwas fehlt?

Update

Ich habe versucht, irrelevante code und dann wird er allmählich und festgestellt, dass alles in Ordnung ist, bis ich die äußere Schleife von ac_search ich bekomme den oben genannten Fehler. hier ist der aktualisierte code, der die Funktion 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

Ich denke der Fehler hat etwas zu tun mit der Funktion addWord was gehört zur Klasse Trie. Wenn ich auskommentiert, diese Funktion habe ich nicht den Fehler mehr.

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;
    }
  • ja, dieselbe Datei !!!
  • Überprüfen Sie, dass ac_search deklariert ist älter als die definition von ac_benchmark_search
  • Können Sie versuchen, indem Sie ac_search statische? Oder setzen ac_search wie extern, um die header-Datei.
  • ja, der code ist zitiert, wie es ist, gleiche Reihenfolge
  • Ich bin nicht sicher, ob ich irgendetwas tun, außer durch hinzufügen des Schlüsselworts extern vor der ac_search definition? Ich habe versucht, dasselbe für static aber es hat nicht funktioniert
  • Versuchen Sie entfernen der irrelevanten code, wie ich gezeigt habe, in der edit. Bitte auch zeigen, gerade genug code, um eine vollständige stand-alone-Beispiel, das sollte kompilieren. Die Idee ist, um anzukommen auf das kleinste Beispiel, dass zeigt das problem; dann haben Sie weniger zu Debuggen.
  • Ich habe folgte Ihr raten, den post entsprechend aktualisiert
  • Werfen Sie einen Blick auf das gepostete code aktualisieren, insbesondere die Anzahl der auskommentierte öffnen Klammern ({) und die Anzahl der auskommentiert schließende Klammern (}). Es ist nicht möglich, kompilieren, da (a) keine Deklaration der record_number im Rahmen. und (b) Sie kommentiert aus EINER offenen Klammer, aber ZWEI in der Nähe Klammern. Das sagt mir irgendwo im code direkt unterhalb dieser ist eine zusätzliche schließende Klammer, die nicht da sein sollte. Wie bist du kompilieren mit eine nicht deklarierte variable ist mir schleierhaft.
  • Danke, aber das Klammer-Problem war nur Tippfehler. Ich habe aktualisiert die post
  • AddWord zu sein scheint, fehlt eine schließende Klammer.
  • Ja, Das ist richtig. Vielen Dank für alle, jeder Kommentar eingegrenzt das problem. War nicht zu erwarten, dass die Klammer kann die Ursache identifier undefiniert Fehler

InformationsquelleAutor Hawk | 2013-10-19
Schreibe einen Kommentar