1

コードは List と size が構造体ではないと言っていますか?

typedef struct HashTable{
    int size;
    ListRef **List; 
} hash;

typedef struct hash *hash_ref;

hash_ref *newHash(int size){
    hash_ref *hashed= NULL;
    if(size<1){
        return NULL;
    }
    if( (hashed=malloc(sizeof(hash))) ==NULL){
        return NULL;
    }
    if( (hashed->List=malloc(sizeof(ListRef*)*size)) ==NULL){
        return NULL;
    }
    for(int i=0; i<size; i++){
        hashed->List[i]=NULL;
    }
    hashed->size=size;

    return hashed;
}

ここに私のリスト機能があります

typedef struct Node{
    long key;/*book id*/
    ListRef data;
    struct Node* next;
    struct Node* prev;
}NodeType;

typedef NodeType* NodeRef;

typedef struct ListHdr{
    NodeRef first;
    NodeRef last;
    NodeRef current;
    long length;
}ListHdr;

このエラーはどうしたのだろうと思っていました。ListヘッダーファイルでListHdrがListRefに変更されたことを追加するのを忘れていました..これは私のhashtableモジュールに含まれています。

現在、2 つのハッシュ テーブルを作成しようとしています。1 つには、2 つの長整数を格納するテーブルがあります。もう 1 つのハッシュテーブルは、1 つの long 整数とリンクされたリスト (2 つの long 整数を持つ) を取ります。

4

2 に答える 2

3

hash_refは へのポインタに型定義されているため、 asではなくとしてhash宣言する必要があります。(後者は、へのポインタへのポインタを効果的に作成します。)hashedhash_ref hashedhash_ref *hashedhash

これに加えて、structを宣言する typedef から省略する必要がありますhash_ref。現在hash_ref、 は pointhashに宣言されていませんが、まだ宣言されていない に宣言されていstruct hashます。これは、コンパイラがそれを a の前方宣言として解釈するためだけにコンパイルされstruct hashます。この解釈により、逆参照を試みるコードは、「ストレージ サイズが不明です」hash_refなどのエラーで失敗します。struct hash

于 2013-05-19T07:36:19.530 に答える
1

.これは、構造体または共用体ではないものを呼び出しているか、構造体または->共用体への直接のポインターではないポインターを呼び出していることを意味します。

hash_ref * hashed は HashTable への DOUBLE ポインターです。単一の逆参照でも、共用体や構造体ではない HashTable ポインターが得られます。

于 2013-05-19T07:33:07.140 に答える