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 undefined
bij de functie die de regel oproept. Ik ben een beetje in de war hier. omdat de functie ac_search
is 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_search
opnam. 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 addWord
die tot de klasse Trie
behoort. 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 addWord
TOEPASSING. Daarom is het geen wereldwijde functie meer. En daarom ziet de compiler deze functie niet buiten addWord
en 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;