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
No.1
- 回答日時:
全体を見たわけではないので自信なしとしておきますが、
struct cell *find(char *tango);
と宣言されているのに、その戻り値
p= find(tango)
を
table[p].jp
と配列の引数にしているのは変ですね。
p->jp
のおつもりなのでは。
No.2
- 回答日時:
まず「実行できません。
」では具体的にどういう症状なのか全くわかりません。command not found なのですか?たぶん違いますよね。詳しく書きましょう。
またmain()で使用しているread_dic()関数とfind()関数が記載されていないので、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
失礼ですが学生さんでしょうか?まず有効な回答が期待できそうな質問の仕方を精進して下さい。そうすることで自分の頭の中が整理できて自己解決できることも多いです。プログラミングってやつは。
それから人にソースを見てもらうならインデント付けくらいは何とかしましょう。
以上、苦言を並べてしまいましたが、あなたの成長を願ってあえて辛辣に書かせて頂きましたのでご理解ください。
アドバイスありがとうございました。初めて質問したので質問の仕方がわからなくてお粗末な質問内容になってしまいました。それについてのアドバイスもありがとうございました。明日早速学校でプログラムを修正してみようと思います。
No.3
- 回答日時:
自己フォロー。
>またmain()で使用しているread_dic()関数とfind()関数が記載されていないの
>で、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
この部分については次の質問に書かれていましたね。失礼しました。m(_ _)m
No.4
- 回答日時:
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]);
}
}
(上記のソースには全角の空白文字が使われています。全角を半角に変換して
使って下さい)
No.5ベストアンサー
- 回答日時:
まだ抜けていました。
ハッシュテーブルを検索するときに 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() も呼び出してあげましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー C2664
-
C言語でクロマキー合成をする方法
-
エラーがわかりません、、
-
ファイル結合
-
c言語でのfscanfについて
-
ファイルへの書込み処理が異常...
-
CRC32の計算方法
-
[C言語]2つのファイルを用いた...
-
Cプログラムの問題
-
a*(1-exp(-bx))+cの近似の方法
-
ファイル出力で改行を入れたい!
-
ガンマ変換 C言語でプログラ...
-
fopenでファイル名に、変数を使...
-
C言語 初心者です。
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
C言語での引数の省略方法
-
ある商品のロス率を5%見込み、...
-
「Aに対するBの割合」と「Aに対...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
ファイルへの書込み処理が異常...
-
C言語でファイル読み書きを早く...
-
エラーがわかりません、、
-
日本語ファイル名のFTPについて
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
テキストファイル内に対して, ...
-
複数ファイルの同時読み込みの...
-
C言語の課題です
-
C言語を用いて、csvファイル内...
-
バイナリファイルの読み込み(C...
-
C言語にてXMLファイルから任意...
-
ファイルが読み込めない・・・
-
構造体のメンバにファイルポイ...
-
CRC32の計算方法
-
ファイルからCR/LFを除去したい
-
C言語におけるファイル読み込み...
-
C言語 csv 配列
-
エラー C2664
おすすめ情報