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 vonac_benchmark_search
- Können Sie versuchen, indem Sie
ac_search
statische? Oder setzenac_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 derac_search
definition? Ich habe versucht, dasselbe fürstatic
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 derrecord_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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom update 2 und nach der Eingrenzung der problem-Bereich, können wir leicht feststellen, dass es eine Klammer fehlt am Ende der Funktion
addWord
. Der compiler wird nie explizit zu identifizieren, wie ein syntax-Fehler. stattdessen wird davon ausgegangen, dass die fehlende Funktionsdefinition befindet sich in einem anderen Objekt-Datei. Der linker beschweren und damit direkt eingeordnet wird, unter einem der breiten der Fehler-Sätze, dieidentifier is undefined
. Vernünftig, denn mit der aktuellen syntax, die nächste Funktion die definition (in diesem Fall istac_search
) werden im Rahmen deraddWord
Umfang. Daher ist es nicht eine Globale Funktion mehr. Und das ist der Grund, warum der compiler nicht sehen, diese Funktion außerhalbaddWord
" und wirft diese Fehlermeldung, die besagt, dass es keine solche Funktion. Eine sehr gute Ausarbeitung über den compiler und den linker gefunden werden können in diesem ArtikelFehlt dir eine Funktion Erklärung?
Fügen Sie es kurz vor Ihrer Umsetzung ac_benchmark_search.
using namespace concurrency; using std::string; using std::cout; using std::endl; using std::vector;
Können Sie auch fehlen
using namespace std;