2012-03-03 6 views
-2

連鎖次のコードは、私に次のエラーを与える分離しますか? コードは次のとおりです。要求「」ハッシュテーブルは

#define SIZE 5 

typedef struct hashTable{ 
    int data; 
    char *name; 
    struct hashTable *next; 
} table; 


int hash_function(int value) 
{ 
    return value % SIZE; 
} 

int insert(char *inFileName, table ***hashLinked) 
{ 
    FILE *inFile; 
    int val = -1; 
    char str[30]; 
    int probe; 

    if ((inFile = fopen(inFileName, "r")) == NULL) 
    { 
     fprintf(stderr,"Error opening input file, %s\n", inFileName); 
     return -1; 
    } 
    while(fscanf(inFile,"%s %d",str,&val) == 2) 
    { 
     probe = hash_function(val); 

     if(hashLinked[probe] == NULL) 
     {        
      **hashLinked[probe] = malloc(sizeof(table)); 
      **hashLinked[probe]->name = (char *)malloc((strlen(str) + 1) * sizeof(char*)); 
      strcpy(**hashLinked[probe]->name,str); 

      **hashLinked[probe]->data = val; 
      **hashLinked[probe]->next = NULL; 
     }            
     else 
     { 
      table* hashLinkedNode = *hashLinked[probe]; 
      while(hashLinkedNode->next!=NULL) 
      {       
       hashLinkedNode = hashLinkedNode->next; 
      } 
      hashLinkedNode->next = malloc(sizeof(table)); 
      hashLinkedNode->next->name = (char *)malloc((strlen(str) + 1) * sizeof(char*)); 
      strcpy(hashLinkedNode->next->name,str); 
      hashLinkedNode->next->data = val; 
      hashLinkedNode->next->next = NULL; 
     } 
    } 
    fclose(inFile); 
    return 0; 
} 


void printList(BookNode *hd) 
{ 
    for (; hd != NULL; hd = hd->next) 
    { 
     printf("[%s,%d]", hd->name, hd->isbn); 
     if (hd->next) 
      printf(" -> "); 
    } 
    printf("\n"); 
} 

void printHashTable(BookNode **temp) 
{ 
    BookNode *tmp = NULL; 
    int i; 
    for(i=0;i<SIZE;i++) 
    { 
     tmp = temp[i]; 
     while(tmp) 
     { 
      printf("%s %d",tmp->name, tmp->isbn); 
      tmp=tmp->next; 
     } 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    table **hashLinked[SIZE]; 
    insert(argv[1],&hashLinked); 
    printHashTable(**hashLinked); 

    return 0; 
} 
+6

コードをコンパイルできない場合、どのようにseg-faultを得ることができますか? –

+1

'table *** hashLinked' ??? 20年後に書いたコードでは、3重間接を使用する必要はありませんでした。再開する。 – trojanfoe

答えて

2

一つの問題は、あなたが

table **hashLinked[SIZE]; 
insert(argv[1],&hashLinked); 

hashLinked、あなたがそれを宣言した型以外のものでinsertを呼び出すことですtableへのポインタへのポインタの配列なので、&hashLinkedですtableへのポインタへのポインタの配列へのポインタであるが、へのポインタへのポインタをとると、insertが宣言されています。私は自分が意図したことを本当に理解したと自信を持っていませんが、合理的であると思われるのは、間接化のレベルを下げることです。 &hashLinkedを渡す理由は、hashLinkedinsertに変更することですが、それはすでにhashLinkedを渡すことで既に行われているため、そのアドレスを渡す必要はありません。これにより、渡された型は、宣言された型と互換性があります。関数の引数としてhashLinkedは、最初の要素のポインタtable ***になります。

次に、あなたはinsertで一貫性のない間接カウントを使用して、エラーの「構造体または共用体ではない何かのメンバーのための要求」を引き起こし*と間違っ->の優先順位を取得します。 **hashLinked[probe]->nameは、**(hashLinked[probe]->name)のように解析されますので、nameのメンバーにtable *にアクセスしてから、その2回参照を取り消そうとします。パラメータタイプがtable ***の場合、正しいアクセスは(*hashLinked[probe])->nameとなり、table **hashLinked[probe]になります。逆参照してtable *になり、その(pointee)メンバーnameにアクセスします。ただし、if (hashLinked[probe] == NULL)をチェックして、そう

**hashLinked[probe] = malloc(sizeof(table)); 

保証nullポインタ間接参照である場合。チェックと次のコードでは、table **のパラメータタイプを実際に持ちたいと考えています。hashLinkedパラメータは、リンクリストの配列tableであり、コードをはるかに簡単にすることができます。 BookNodeタイプに充填し、いくつかの変数とパラメータを適応させる、私は警告のないコンパイルし、それはあなたが意図したもので行う可能性がありますように見えます

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

#define SIZE 5 

typedef struct hashTable { 
    int data; 
    char *name; 
    struct hashTable *next; 
} table; 

typedef struct book { 
    int isbn; 
    char *name; 
    struct book *next; 
} BookNode; 

int hash_function(int value) 
{ 
    return value % SIZE; 
} 

int insert(char *inFileName, table **hashLinked) 
{ 
    FILE *inFile; 
    int val = -1; 
    char str[30]; 
    int probe; 

    if ((inFile = fopen(inFileName, "r")) == NULL) 
    { 
     fprintf(stderr,"Error opening input file, %s\n", inFileName); 
     return -1; 
    } 
    while(fscanf(inFile,"%s %d",str,&val) == 2) 
    { 
     probe = hash_function(val); 

     if(hashLinked[probe] == NULL) 
     { 
      hashLinked[probe] = malloc(sizeof(table)); 
      hashLinked[probe]->name = (char *)malloc((strlen(str) + 1) * sizeof(char*)); 
      strcpy(hashLinked[probe]->name,str); 

      hashLinked[probe]->data = val; 
      hashLinked[probe]->next = NULL; 
     } 
     else 
     { 
      table* hashLinkedNode = hashLinked[probe]; 
      while(hashLinkedNode->next!=NULL) 
      { 
       hashLinkedNode = hashLinkedNode->next; 
      } 
      hashLinkedNode->next = malloc(sizeof(table)); 
      hashLinkedNode->next->name = (char *)malloc((strlen(str) + 1) * sizeof(char*)); 
      strcpy(hashLinkedNode->next->name,str); 
      hashLinkedNode->next->data = val; 
      hashLinkedNode->next->next = NULL; 
     } 
    } 
    fclose(inFile); 
    return 0; 
} 

void printList(BookNode *hd) 
{ 
    for (; hd != NULL; hd = hd->next) 
    { 
     printf("[%s,%d]", hd->name, hd->isbn); 
     if (hd->next) 
      printf(" -> "); 
    } 
    printf("\n"); 
} 

void printHashTable(table **temp) 
{ 
    table *tmp = NULL; 
    int i; 
    for(i = 0; i < SIZE; i++) 
    { 
     tmp = temp[i]; 
     while(tmp) 
     { 
      printf("%s %d",tmp->name, tmp->data); 
      tmp = tmp->next; 
     } 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc < 2) 
     return -1; 
    table *hashLinked[SIZE]; 
    insert(argv[1],hashLinked); 
    printHashTable(hashLinked); 
    return 0; 
} 

に到着します。