题
我工作上的家庭作业在我需要使用炭阵列,而不是弦及时,qsort/bsearch.在我的电话bsearch下面,我 知道吗 我传递错误的尺寸的条目,但是我不知道如何获得真正的大小,并且我compareEntries功能,因此没有找到正确的对象。
任何人都可以帮我了解我的失踪?
#include <iostream>
using namespace std;
typedef Entry* EntryPtr;
class Dictionary
{
public :
Dictionary( const char *filename );
~Dictionary();
const char *lookupDefinition( const char *word );
private :
int m_numEntries;
EntryPtr *m_entries;
static int compareEntries(const void *leftSide, const void *rightSide);
};
int Dictionary::compareEntries(const void *leftSide, const void *rightSide)
{
EntryPtr lside = (EntryPtr) leftSide;
EntryPtr rside = (EntryPtr) rightSide;
return strcmp(lside->Word, rside->Word);
}
const char *Dictionary::lookupDefinition(const char *word)
{
if (m_numEntries == 0)
return 0;
EntryPtr result = (EntryPtr) bsearch(word, m_entries,
m_numEntries, sizeof(m_entries[0]), Dictionary::compareEntries);
return result->Definition;
}
class Entry
{
public:
Entry(const char *line);
char *Word;
char *Definition;
};
int main()
{
Dictionary dict( "C:\\path\\file.txt" );
dict.lookupDefinition("chair");
return 0;
}
解决方案
为什么不sizeof(Entry)
工作?
再次改变 - 我想的大小应该是指针的大小....
EntryPtr tmp = new Entry("");
tmp->Word = word;
EntryPtr result = (EntryPtr) bsearch(tmp, m_entries,
m_numEntries, sizeof(EntryPtr), Dictionary::compareEntries);
其他提示
的问题是,在bsearch
使用的比较函数期望word
为类型Entry*
(或m_entries
为类型char**
的)的。
你知道 bsearch
需要按输入,正确吗?
sizeof(m_entries[0])
看起来完全没给我。
编辑:现在我看到的问题。你的字典中类包含一系列的指针。问题是在compareEntries功能,你在哪里铸通过的指针 EntryPtr
;你需要投他们 EntryPtr *
代替。
编辑2:正如指出的 阿米特*库马尔*, 您 还 需要改变的关键参数发送到bsearch,或者,你需要意识到,指针,你收到compareEntries不是指向同一类型,并将需要两种不同类型转化.
的sizeof(条目)将工作。大多的sizeof应的类型,而不是实例中使用。
<强>的sizeof(条目)强>
优选的是
<强>项E;结果 的sizeof(E); 强>
或
<强>条目* E;结果 的sizeof(* E); 强>
所有给出相同的结果。
#include "stdio.h"
class Entry {
double e;
int i;
};
int main() {
Entry e;
printf("%d\n", sizeof(e));
printf("%d\n", sizeof(Entry));
printf("%d\n", sizeof(*(&e)));
return 0;
}
阅读 手动的 小心。
其他人提出的观点的摘要,以及其他几个问题:
您的使用情况 大小 是正确的。
您应该将指针传递给包含要查找的键的条目。实际上,键可以是任何东西,它将作为第一个参数传递给比较函数,您只需将两个参数转换为正确的类型即可。(比较函数仍应与项目排序的顺序相对应。)比较函数中的转换不正确。比较函数接收指向元素的指针(在您的情况下是指向 Entry 的指针,因此比较函数接收指向 Entry 的指针)。
您将结果转换为错误的类型。该函数再次返回一个指向数组中元素的指针(指向 Entry 的指针)。
如果键不存在,则不检查结果是否为 NULL。
您可能会放弃一级间接(您真的需要一个指针数组而不是一个条目数组吗?)
您应该将其作为人们谈论类型安全优点时的含义的一个很好的例子:在您的代码中,几乎所有类型都混合在一起,并且您使用错误的类型做了错误的事情,但编译器没有发出任何抱怨。如果你搞砸了,这就是你得到的结果
void*
, ,除非你确切地知道自己在做什么。
有趣的是,拥有一个指针数组需要大量的间接寻址才能获得结果:
#include <cstdlib>
#include <string>
#include <iostream>
int compare_string(const void* a, const void* b)
{
return ((const std::string*)a)->compare(**(const std::string**)b);
}
int main()
{
std::string a("a"), b("b"), c("c");
std::string* array[3] = { &a, &b, &c };
std::string key = "b";
std::string** result = (std::string**)bsearch(&key, array, 3, sizeof(std::string*), compare_string);
if (result) std::cout << **result << '\n';
}
IMO,实现您自己的类型安全 bsearch 所需的时间比弄清楚所有这些并对其进行测试和调试所需的时间要少。