本のサンプルプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Cひさしぶり

本のサンプルプログラム

#1

投稿記事 by Cひさしぶり » 11年前

本のサンプルプログラムを実行できせん。よければ助けてください。

コード:

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

typedef struct
{
  char*english;
  char*japanese;

}WORDSET;

typedef struct
{
    WORDSET **data;
    unsigned  int size;
}HASHTABLE;
unsigned int  MakeHash2(char*str,unsigned int hashmax)
{ unsigned int n,length,hash,weight;

length=strlen(str);
for(n=weight=hash=0;n<length;++n,++weight)
{ if(weight>7){
      weight=0;
         }
     hash+=(int)str[n]<<(4*weight);

 }
 return hash%hashmax;

}

unsigned int ReHAsh(HASHTABLE *hashtable,unsigned int firsthash)
{ 
  unsigned int hashval,k;
 for(k=1;k<=hashtable->size/2;++k)
 { 
   hashval=(firsthash+k*k)%hashtable->size;
    if(hashtable->data[hashval]==NULL)
        return hashval;
 }

 return -1;



}

void AddDataToMap(HASHTABLE *hashtable ,WORDSET *newdata)
{
  unsigned int hashval;
  
  hashval=MakeHASH2(newdata->english,hashtable->size);

   if(hashtable->data[hashval]!=NULL)
   { hashval=ReHash(hashtable,hashval);
     
     if(hashval==-1)
       {
         printf("%sをマップに挿入しようと試みましたが空き位置がありませんでした\n"
         ,newdata->english);
           return;
        }
     
     }
   hashtable->data[hashval]=newdata;
}

char *GetDataFromMap(HASHTABLE *hashtable,char *key)
{
    unsigned int hashval,k;
    WORDSET *word;

    hashval=MakeHash2(key,hashtable->size);
    for(k=0;k<=hashtable->size/2;++k)
 {   word=hashtable->data[(hashval+k*k)%hashtable->size];
      if(word!=NULL)
         if(strcmp(key,word->english)==0)
             return word->japanese;
 }


return NULL;



      }

WORDSET *DeleteDataFromMap(HASHTABLE *hashtable,char *key)
{    
      unsigned int hashval,k;
      WORDSET *word;
    
      hashval=MakeHash2(key,hashtable->size);

      for(k=0;k<=hashtable->size/2;++k)
        { word=hashtable->data[(hashval+k*k)%hashtable->size];
          if(word!=NULL)
            {
               if(strcmp(key,word->english)==0)
                 {
                     hashtable->data
                               [(hashval+k*k)%hashtable->size]=NULL;
                               return word;
                  }
             }

          }
        return NULL;    
}


void InitHashTable(HASHTABLE *hashtable, unsigned int size)
{ hashtable->data=(WORDSET**)malloc(sizeof(WORDSET*)*size);
  memset(hashtable->data,NULL,sizeof(WORDSET*)*size); 
  hashtable->size=size;

}

void CleanupHashTable(HASHTABLE *hashtable)
{ free(hashtable->data);
   hashtable->size=0;

}

void PrintALLData(HASHTABLE *hashtable)
{
  unsigned int n;
  for(n=0;n<hashtable->size;++n)
     if(hashtable->data[n]->english
                ,hashtable->data[n]->japanese);

}
int main (void){
unsigned int n;
char key[64],*japanese;
HASHTABLE hashtable;
WORDSET *wordfound;

WORDSET words[5]={
                  {"dolphin","イルカ"},{"beluga","シロイルカ"},
                  {"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
                 };
InitHashTable(&hashtable,503);
for(n=0;n<5;++n)
  AddDataToMap(&hashtable,&words[n]);

  do
  {
      printf("どの操作を行いますか?(1:検索2:削徐3:全表示 0:終了)\n");
       scanf("%d",&n);
        
       switch(n){
         case 1: 
              printf("検索する英単語を入力してください:");
              scanf("%s",key);
              japanese=GetDataFromMap(&hashtable,key);        
               if(japanese!=NULL)
                  printf("%sの和訳は%sです。\n",key,japanese);  
                else
                  printf("%sがマップのなかに見つかりませんでした。\n",key);
                break;
         case 2:
               printf("削除する英単語を入力してください:");
               scanf("%s",key);
               wordfound=DeleteDataFromMap(&hashtable,key);
               if(wordfound!=NULL)
                  printf("%sをマップから削除しました。\n",key);
                else
                  printf("%sがマップのなかに見つかりませんでした。\n",key);
                 break;
          case 3:
             PrintAllData(&hashtable);
              break;         
                 }


    }while(n!=0);
      
     CleanHashTable(&hashtable);

     return (0);

}
コンパイルエラーは下記です。長くなってすいません。
book7.c: In function 'InitHashTable':
book7.c:114:3: warning: passing argument 2 of 'memset' makes integer from pointe
r without a cast [enabled by default]
memset(hashtable->data,NULL,sizeof(WORDSET*)*size);
^
In file included from book7.c:2:0:
c:\mingw\include\string.h:52:39: note: expected 'int' but argument is of type 'v
oid *'
_CRTIMP void* __cdecl __MINGW_NOTHROW memset (void*, int, size_t);
^
book7.c: In function 'main':
book7.c:141:65: warning: missing terminating " character [enabled by default]
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:141:19: error: missing terminating " character
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:142:19: error: expected '}' before ';' token
};
^
book7.c:149:14: warning: unknown escape sequence: '\216' [enabled by default]
printf("どの操作を行いますか?(1:検索2:削徐3:全表示 0:終了)\n");
^
book7.c:183:1: error: expected ',' or ';' at end of input
}
^
book7.c:183:1: error: expected declaration or statement at end of input

C:\Users\延孝>gcc book7.c -o book7
book7.c: In function 'InitHashTable':
book7.c:114:3: warning: passing argument 2 of 'memset' makes integer from pointe
r without a cast [enabled by default]
memset(hashtable->data,NULL,sizeof(WORDSET*)*size);
^
In file included from book7.c:2:0:
c:\mingw\include\string.h:52:39: note: expected 'int' but argument is of type 'v
oid *'
_CRTIMP void* __cdecl __MINGW_NOTHROW memset (void*, int, size_t);
^
book7.c: In function 'main':
book7.c:141:65: warning: missing terminating " character [enabled by default]
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:141:19: error: missing terminating " character
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:142:19: error: expected '}' before ';' token
};
^
book7.c:149:14: warning: unknown escape sequence: '\216' [enabled by default]
printf("どの操作を行いますか?(1:検索2:削徐3:全表示 0:終了)\n");
^
book7.c:183:1: error: expected ',' or ';' at end of input
}
^
book7.c:183:1: error: expected declaration or statement at end of input
お返事お願いします。

Cひさしぶり

Re: 本のサンプルプログラム

#2

投稿記事 by Cひさしぶり » 11年前

コンパイルエラーを重複して入力し、申し訳ございません。

box
記事: 2002
登録日時: 14年前

Re: 本のサンプルプログラム

#3

投稿記事 by box » 11年前

もし、その本に書いてあるとおりに入力した結果が
そのグッチャングッチャンなインデントであるならば、
その本は捨ててください。

memset関数を使っているところ、その本には本当にそう書いてありますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 本のサンプルプログラム

#4

投稿記事 by みけCAT » 11年前

カワウソが悪さをしていますね。
ソースコードをUTF-8で書くか、
gccをお使いであれば、コンパイルオプションに-finput-charset=cp932 -fexec-charset=cp932を追加してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

hoge

Re: 本のサンプルプログラム

#5

投稿記事 by hoge » 11年前

129-130行目あたり、不思議な構文だな。
多分打ち間違い。本に本当にこう書いてあったら、出版社に問い合わせる。

Cひさしぶり

Re: 本のサンプルプログラム

#6

投稿記事 by Cひさしぶり » 11年前

出版社のホームページに、修正版が配布されており、コンパイルオプションを使い実行できました。
お返事ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る