1

辞書のすべての単語にfnv1aハッシュ関数を実装しようとしています(後ですぐにアクセスできるように)。

これはfnv1aハッシュ関数です。

int
fnv1a(unsigned char byte, uint32_t hash)
{
    hash = SEED;
    // SEED is a constant that I defined
    return ((byte ^ hash) * PRIME) % HASHTABLE_SIZE;
}

そして、これは私がload()と呼ばれる関数で単語のハッシュを取得しようとしている方法です:

int hash = fnv1a((unsigned char)*(ptr->word)++, SEED);

完全な機能は次のとおりです。

/**辞書をメモリにロードします。成功した場合はtrueを返し、そうでない場合はfalseを返します。* /

bool
load(const char *dictionary)
{    
    FILE* fp = fopen("words.txt", "r");

    // make new node to store the stuff in
    node *ptr = malloc(sizeof(node));
    ptr->next = NULL;

    // while it's not the end of the file
    while(!feof(fp))
    {
        // store the word in the ptr
        fscanf(fp, "%s", ptr->word);

        // get hash function for word
        int hash = fnv1a((unsigned char)*(ptr->word)++, SEED);

        // store word at hash value in hashtable

        // if there isn't a word there yet
        if (hashtable[hash]->next == NULL) 
            hashtable[hash]->next = ptr;  

    // else go to the end of the list and add the word

    // haven't done this part yet

    if (hashtable == NULL)
    {
        printf("Didn't work out, bud");
        return false;
    }   

    else 
        return true;
}

このコードをコンパイルするときに発生し続けるエラー(単語をハッシュしようとしている行を指しています):

dictionary.c:70:53: error: lvalue required as increment operand
4

2 に答える 2

2

の型は、、またはptr->wordの配列のようです。配列をインクリメントしたり、デザインを変更したりすることはできません。charchar []

于 2013-03-19T12:10:55.013 に答える
2

あなたは次のようにあなたの問題を簡単に解決することができます:

char* ptr = &ptr->word[0];

fnv1a(*ptr++, SEED);
于 2013-03-19T12:12:00.297 に答える