1

文字列をunsignedchar*に変換しようとしています。そして、私は輪になって走っています。私のプログラムは、文字列として取り込む姓の入力をユーザーに求めます。次に、djb2を使用して文字列を整数にハッシュします。これは、unsignedchar*をパラメーターとして受け取ります。私のプログラムの目標は、連鎖を使用して衝突を処理するハッシュテーブルを作成することです。

unsigned long djb2(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

私のコードは次のatmです。

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize)
{
    char * cstr;
    string str;
    cin >> str;
    cstr = new char [str.size()+1];
    strcpy (cstr, str.c_str());
    int hashBucket1 = djb2(cstr) % listSize;
}

「「char*」型の引数は「unsignedchar*」型のパラメータと互換性がない」という上記のエラーが発生しました。助けていただければ幸いです。

4

2 に答える 2

4

このようなタイピングの問題がある場合は、その言語を適切に使用していないことを示しています。C++ で文字列と char* の間を行き来するのは、悪いコードの匂いです。

dbjc文字列を使用するように変更します。

unsigned long djb2(const string& str)
{
    unsigned long hash = 5381;

    for(string::iterator it=str.begin();it!=str.end();it++) 
        hash = ((hash << 5) + hash) + *it; /* hash * 33 + character */

    return hash;
}

これにより、挿入が大幅に簡素化されます。

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize){
    string str;
    cin >> str;
    int hashBucket1;
    hashBucket1 = djb2(str) % listSize;
}
于 2012-05-26T18:54:03.047 に答える
0

最善の解決策はdbjc、@Steven Burnap によって提案されているように、関数を変更することです。

変更できない場合は、通話中dbjcにキャストcstrします。unsigned char *dbjc

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize){
        char * cstr;
        string str;
        cin >> str;
        cstr = new char [str.size()+1];
        strcpy (cstr, str.c_str());
        int hashBucket1;
        hashBucket1 = djb2((unsigned char *)cstr) % listSize; // <-- here is the change
}
于 2012-05-26T19:04:27.523 に答える