質問

私自身の宿題を課題とっての利用に必要なchar配列の代わりに文字列と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_entrieschar**であるように)であることを期待するということです。

いることを知 bsearch が必要でソートを入力す。

sizeof(m_entries[0]) 見晴しい。

編集:今の問題です。お辞書クラスを含む配列へのポインタ.問題は、compareEntries機能で、キャストに渡されポインタ EntryPtr;必要なものをキャストしてい EntryPtr * です。

編集2:指摘しているように Amit Kumar, す 変更が必要なキーパラメータに送信するbsearch、または必要なことに気付きのポインタまでcompareEntriesなることを指摘し、同じ種類、必要なものを二つの異なるtypecasts.

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

を読む マニュアル ます。

の概要ポイントで他で行われた、カップル問題:

  • ご利用になる皆様 sizeof に通知するものとします。

  • きのパスを指すポインタを含むエントリのキーで見たいと思います。 実際の鍵は何もしませんでした比較機能として最初の引数だけキャストの両方の引数が正ます。(比較機能は依然として対応した順に項目をソートされます。)

  • のかぶりとの比較機能が正しくありません。の比較機能を受けるポインタの要素がある場合はポインタを入力するには比較機能を受けポインタをポインタます。

  • まキャストの結果に間違ったタイプです。の機能のポインタを返し要素の配列(ポインタをポインタます。

  • んだ結果が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、かかるすべての図ることで試験およびデバッグ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top