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