VS2012 Expressを使用してC++で次のコードを記述しました。
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;
}
関数呼び出し行でエラーidentifier "ac_search" is undefined
が発生します。ここでは少し混乱しています。関数ac_search
がグローバルとして宣言されているためです(コンテナー内ではありません)。なぜ私はこの場所でそれを呼ぶことができないのですか?何か不足していますか?
更新
私は無関係なコードを無視してみて、徐々にそれを含めてみましたが、ac_search
の外側のループを含めるまではすべて問題なく、前述のエラーが発生しました。これは関数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;
}
// }
//}
}
更新2
エラーはクラスaddWord
に属する関数Trie
に関係していると思います。この関数をコメント化したところ、エラーは発生しなくなりました。
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;
}
アップデート2から問題の範囲を絞り込んだ後、関数addWord
の末尾にブレースがないことが簡単にわかります。コンパイラはそのような構文エラーを明示的に識別しません。代わりに、不足している関数定義が他のオブジェクトファイルにあると想定します。リンカはそれについて文句を言うので、identifier is undefined
という広範なエラーフレーズの1つに直接分類されます。合理的には、現在の構文では次の関数定義(この場合はac_search
)がaddWord
スコープの下に含まれるためです。したがって、それはもはやグローバル関数ではありません。コンパイラがaddWord
の外でこの関数を認識せず、そのような関数がないことを示すこのエラーメッセージをスローするのはそのためです。コンパイラとリンカに関する非常に優れた詳細は、この article にあります。
関数宣言がありませんか?
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);
Ac_benchmark_searchの実装の直前に追加します。