質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

981閲覧

ハッシュの使い方について

Amateur0845

総合スコア6

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/26 04:26

編集2020/07/26 05:05
1行が「氏名,携帯電話番号」で構成されるデータファイル(data.txt)を読み込み、氏名をアルファベット順にソートし、氏名に対応する電話番号を探索して表示するプログラムを作成した(sample.cpp)。 sample.cppを実行すると以下のようになる。 ./sample data.txt ABERU_ANDORE > 090-9855-2390 ABERU_ANZYARI > 090-6353-5820 ABERU_ARUTOXURO > 090-3985-2411 ... ... ZYURI_YUKITADA > 090-5051-6946 ZYURI_YUMINOSIN > 090-8635-8566 ZYURI_ZINNOSUKE > 090-7213-5425 すべての機能を書いたのですがコンパイル時にハッシュの定義が曖昧であるとエラーが出てしまいます。 ### 発生している問題・エラーメッセージ kimatu.cpp:39:23: error: reference to ‘hash’ is ambiguous int initialize(struct hash *h, int size) など引数にハッシュ関数を持つ関数は全てエラーが出てしまいます。 なぜエラーが出るのか調べても分かりません。 定義もしているつもりなので手のほどこし様なかいです。 環境なのでしょうか? 今の環境はmobaxtarmにUbuntuです。

該当のソースコード

c++

1コード 2 3include <iostream> 4 5include <fstream> 6 7include <stdlib.h> 8 9include <string.h> 10 11include <cmath> 12 13define HashSize 1000 14 15using namespace std; 16 17 18 19// セルを表わす構造体の定義 20 21struct cell 22 23{ 24 25string name; // 名前 26 27string value; 28 29struct cell *next; // 次のデータへのポインタ 30 31}; 32 33 34 35// ハッシュ表 36 37struct hash 38 39{ 40 41int size; // ハッシュ表の大きさ 42 43struct cell **table; 44 45}; 46 47// ハッシュ関数(keyのハッシュ値を返す) 48 49// 文字列の1文字ごとの文字コードを加算するハッシュ関数 50 51int hash1(string key, int size) 52 53{ 54 55unsigned int v=0; 56 57 58 59for(int i=0;i<key.length();i++) 60 61{ 62 63v+=key[i]*pow(2,i); 64 65} 66 67 68 69return v%size; 70 71} 72 73 74 75 76 77/*--- ハッシュ表の初期化 ---*/ 78 79int initialize(struct hash *h, int size) 80 81{ 82 83h->table=(cell**)new struct cell[size]; 84 85h->size=size; 86 87 88 89for(int i=0;i<size;i++) 90 91{ 92 93h->table[i]=NULL; 94 95} 96 97return 1; 98 99} 100 101 102 103// データの追加 104 105int add(struct hash *h, string name, string value) 106 107{ 108 109// 追加するデータのハッシュ値 110 111int hash_value=hash1(name, h->size); 112 113 114 115// 接続するデータを格納する要素を生成 116 117struct cell *temp; 118 119temp=new struct cell; 120 121temp->name=name; 122 123temp->value=value; 124 125 126 127// 要素をハッシュに追加(上書きで追加) 128 129temp->next=h->table[hash_value]; 130 131h->table[hash_value]=temp; 132 133return 0; 134 135} 136 137 138 139struct cell *search_tel(struct hash *head, string name) 140 141{ 142 143int hash_value=hash1(name,head->size); 144 145struct cell *buf=head->table[hash_value]; 146 147while(buf!=NULL) 148 149{ 150 151if(buf->name == name) 152 153{ 154 155return buf; 156 157} 158 159buf=buf->next; 160 161} 162 163return NULL; 164 165} 166 167 168 169// ファイルの要素数を取得 170 171int get_nx(char *f_name) 172 173{ 174 175ifstream fp(f_name); // ファイルオープン 176 177 178 179if(!fp) 180 181{ 182 183cout<<"Can't open file. "<<f_name<<endl; 184 185exit(-1); 186 187} 188 189 190 191// ファイルの要素数を取得 192 193string line; 194 195int nx=0; 196 197while(fp>>line) 198 199{ 200 201nx++; 202 203} 204 205fp.close(); 206 207return nx; 208 209} 210 211 212 213// 2つのint型の変数を入れ替える 214 215void exchange(string *a, string *b) 216 217{ 218 219string tmp; 220 221tmp=*a; 222 223*a=*b; 224 225*b=tmp; 226 227} 228 229 230 231// アルファベット順にソート 232 233void name_sort(string name_data[], int left,int right) 234 235{ 236 237int index1=left; // 左カーソル 238 239int index2=right; // 右カーソル 240 241string x=name_data[left]; // 選択要素 242 243// 2-5. 左右の検索位置が逆転するまで繰り返す 244 245do 246 247{ 248 249// 2-1. 選択した要素より大きい要素を左から検索 250 251while (name_data[index1]<x) 252 253{ 254 255index1++; 256 257} 258 259// 2-2. 選択した要素より小さい要素を右から検索 260 261while (name_data[index2]>x) 262 263{ 264 265index2--; 266 267} 268 269// 2-3. 入れ替え 270 271if (index1<=index2) 272 273{ 274 275exchange(&name_data[index1],&name_data[index2]); 276 277index1++; 278 279index2--; 280 281} 282 283}while (index1<index2); 284 285// 2-6. 入れ替え 286 287if(left<index2) { 288 289exchange(&name_data[left],&name_data[index2]); 290 291} 292 293// 小さいもの同士でクイックソート 294 295if(left<index2) { 296 297name_sort(name_data,left,index2); 298 299} 300 301// 大きいもの同士でクイックソート 302 303if(index1<right) { 304 305name_sort(name_data,index1,right); 306 307} 308 309} 310 311 312 313int main(int argc, char *argv[]){ 314 315if(argc==1) // 引数がない場合 316 317{ 318 319cout<< "input file name\n"; 320 321return -1; 322 323} 324 325ifstream fp(argv[1]); // ファイルオープン 326 327// ハッシュ表の定義と初期化 328 329struct hash *hash_table; 330 331hash_table=new struct hash; 332 333initialize(hash_table, HashSize); 334 335int nx=get_nx(argv[1]); // ファイルの要素数を取得 336 337string *name_data; 338 339name_data=new string[nx]; // 名前を格納 340 341 342 343string line; 344 345int i=0; 346 347while(fp>>line) 348 349{ 350 351// 名前と電話番号に分割 352 353int index=line.find(","); 354 355string name=line.substr(0,index); 356 357string tel=line.substr(index+1); 358 359 360 361// ハッシュにデータを追加 362 363add(hash_table,name,tel); 364 365 366 367 368 369// 名前を配列に格納 370 371name_data[i]=name; 372 373i++; 374 375} 376 377fp.close(); 378 379 380 381// 名前をアルファベット順にソート 382 383name_sort(name_data, 0, nx-1); 384 385 386 387// 全表示 388 389 390for(int ky=0;ky<nx;ky++) 391 392{ 393 394struct cell *s_cell=search_tel(hash_table, name_data[ky]); 395 396 397 398if (s_cell==NULL) { 399 400cout<<s_cell->name<< "-> none"<<endl; 401 402} else { 403 404cout<<s_cell->name<<"-> "<<s_cell->value<<endl; 405 406} 407 408} 409 410 411 412return 0; 413 414}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/07/26 04:29

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
Amateur0845

2020/07/26 04:33

ありがとうございます。 訂正致しました。
Daregada

2020/07/26 04:51 編集

訂正できていませんよ。Cのプログラムの部分だけを「```C++」と「```」で囲むんです。
Amateur0845

2020/07/26 05:05

何度もすみません。 訂正致しました。 申し訳ございません。
guest

回答1

0

ベストアンサー

名前空間 std にも struct hash があります。そいつと区別がつかなくなってる(ambiguous)ようです。
hash を改名するか、あるいは using namespace std を諦めるか。

using namespace std を外し、string -> std::string 等、すべてに std:: したところ、コンパイルエラーは解消されました。(動作確認はやってないけど)

投稿2020/07/26 05:02

編集2020/07/26 05:03
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Amateur0845

2020/07/26 05:15

名前空間との重複での曖昧というエラーだったのですか、、 コンパイルも実行も通りました。 まだまだ精進したいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問