【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

void read_dic()
{
char eng2[20], jp2[40];
FILE *fp;
int i=0;

if((fp=fopen("dic.txt", "r"))==NULL) {
printf("\n ファイルがありません\n");
exit(1);
} else {
printf("読み込み中...\n");
while (!feof(fp)) {
fscanf(fp, "%s %s", eng2, jp2);
strcpy(table[i].eng, eng2);
strcpy(table[i].jp, jp2);
i++;
if(i>=100){
printf("辞書のテーブルがいっぱいです\n");
fclose(fp);
exit(1);
}
}
fclose(fp);
printf("読み込み終了\n");
n = i;
}
}



int hash(char *tango)
{
int h=0,p=256;
while (*tango!='\0')
{
h = h*p + *tango;
h = h%BUCKET_SIZE;
tango++;
}
return(h);
}

struct cell *find(char *tango)
{
int a;
struct cell *q;
a=hash(tango);
if(bucket[a].chain==NULL)
return NULL;
else{
q=bucket[a].chain;
while ((strcmp(q->eng,tango))!=0){
if(q->next==NULL)
return NULL;
else
q=q->next;
}
return q;
}
}

以前の投稿は
http://oshiete1.goo.ne.jp/kotaeru.php3?qid=109202

A 回答 (5件)

全体を見たわけではないので自信なしとしておきますが、


struct cell *find(char *tango);
と宣言されているのに、その戻り値
p= find(tango)

table[p].jp
と配列の引数にしているのは変ですね。
p->jp
のおつもりなのでは。
    • good
    • 0

まず「実行できません。

」では具体的にどういう症状なのか全くわかりません。
command not found なのですか?たぶん違いますよね。詳しく書きましょう。
またmain()で使用しているread_dic()関数とfind()関数が記載されていないので、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
失礼ですが学生さんでしょうか?まず有効な回答が期待できそうな質問の仕方を精進して下さい。そうすることで自分の頭の中が整理できて自己解決できることも多いです。プログラミングってやつは。
それから人にソースを見てもらうならインデント付けくらいは何とかしましょう。
以上、苦言を並べてしまいましたが、あなたの成長を願ってあえて辛辣に書かせて頂きましたのでご理解ください。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。初めて質問したので質問の仕方がわからなくてお粗末な質問内容になってしまいました。それについてのアドバイスもありがとうございました。明日早速学校でプログラムを修正してみようと思います。

お礼日時:2001/07/27 19:18

自己フォロー。


>またmain()で使用しているread_dic()関数とfind()関数が記載されていないの
>で、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
この部分については次の質問に書かれていましたね。失礼しました。m(_ _)m
    • good
    • 0

ranxさんがすでに指摘されている点は、少なくとも修正が必要です。


それに加えて、ハッシュテーブル bucket[] を作成する処理が全く抜けています
ので今のままでは「白紙の辞書」を見て検索しているに過ぎません。

ハッシュテーブル作成処理
  例えば、こんな感じの関数を作って read_dic() の後で hash_table() を
  呼び出します。
  void hash_table()
  {
    int i, h;
    struct cell **p
    
    for( i=0; i<BUCKET_SIZE; i++ )
      bucket[i].cell = NULL;
    
    for( i=0; i<n; i++ ){
      h = hash( table[i].eng );
      p = &(bucket[h].cell);
      while( *p != NULL )
        p = &(*p->next);
      *p = &(table[i]);
    }
  }

(上記のソースには全角の空白文字が使われています。全角を半角に変換して
 使って下さい)
    • good
    • 0

まだ抜けていました。



ハッシュテーブルを検索するときに table[x]->next が NULL なのかどうなのかを
チェックしますので、テーブルを作成するときまたは初期化するときに、この next
を NULL にしておかなければうまく動かない可能性があります。
実行環境によっては明示的に初期化しなくても NULL になっている場合もあります
が、他人任せにしておくのはよくありません。

read_dic()関数内の読み込みのところで

  strcpy(table[i].eng, eng2);
  strcpy(table[i].jp, jp2);

とやっているところがあるので、この直後に次の行を追加して下さい。

  table[i].next = NULL;

ついでに補足すると、init_table()が呼び出されていませんので、read_dic() を呼び
出す前ぐらいに init_table() も呼び出してあげましょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!