• ベストアンサー

クイックソート

実行時にエラーが出てしまいます。問題点がわかる方お願いします。(インクルード略、800字に収まらなかったので問題があると思われる部分だけ書きます。)ちなみにエラーは外部参照~という感じです。 typedef struct in_data { char bango[No_SIZE]; int ki; }RD; RD *q_sort(RD a[],int n0,int nn); void swap(RD *pa,RD *pb); void main() { FILE *fpa; FILE *fpb; char in_buff[BUFF_SIZE]; RD buff[ARRY_SIZE]; int i; fpa = fopen("data.TXT","r"); for(i=0;i < ARRY_SIZE;i++){ fgets(in_buff,BUFF_SIZE,fpa); strncpy(buff[i].bango,in_buff,No_SIZE); buff[i].bango[No_SIZE] = '\n'; buff[i].ki = atoi(&in_buff[No_SIZE]); } fclose(fpa); q_sort(buff,0,ARRY_SIZE-1); fpb = fopen("result.TXT","w"); for(i=0;i < ARRY_SIZE ; i++) fprintf(fpb,"%*s %*d\n",No_SIZE,buff[i].bango, season_SIZE,buff[i].ki); fclose(fpb); } RD *qsort(RD a[],int n0,int nn) { char x; int i,j; if(nn - n0 == 1){ if(strcmp(a[n0].bango,a[nn].bango)>0) swap(&a[n0],&a[nn]); } else if (nn - n0 >1){ x = (n0+nn)/2;

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

やはり、エラーを正確に書いていただくと助かりますね。 直接のエラーの原因は、 RD *q_sort(RD a[],int n0,int nn); (プロトタイプ宣言) q_sort(buff,0,ARRY_SIZE-1); (関数の呼び出し) RD *qsort(RD a[],int n0,int nn) (関数定義) で名前が間違っているせいです。 このために、呼び出されている、q_sort の実体がないよと、リンカがエラーをだしているのです。 あと、リンカのエラーを見ると、C++ で組まれているので、Cの標準ライブラリ qsort との衝突は起こっていないようです。(C++なので、引数が違うと別の関数として扱われる) これで、エラー表示は回避できるでしょう。 動作はまだ考える必要がありそうですが。

leak
質問者

お礼

お返事ありがとうございます。 おっしゃられたとおりに書き直したところ無事実行できました。 ただ、危惧しておられるとおり入力ファイルと出力ファイルでデータが変わってしまってうまくいきませんでした。

その他の回答 (3)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.3

RD *qsort(RD a[],int n0,int nn) この行のせいでエラーが出ています。 「外部参照~」は同じ名前の関数が2個以上あるときにリンカから出るエラーです。 qsortはCが元々持っている関数です。 RD *q_sort(RD a[],int n0,int nn) に直せば、「外部参照~」エラーはなくなります。 プログラム自体はNo.1,No.2の方を参考にしてください。

leak
質問者

お礼

ご解答ありがとうございます。 他のお二方の返答も参考にしてやってみます。

回答No.2

まず、本当に「実行時にエラー」ですか? それに、表示されたエラーは「正確に」書くべきです。 実行時に、「外部参照」という言葉を含むエラーは出てこない気がしますが(コンパイル時か、リンク時) ぱっと見たところ、season_SIZE が定義されていないというところではないでしょうか? 他には「外部参照」云々というエラーが出そうなところがないので。 season_SIZE については、これが出てくる、fprintf の書式指定子とのつじつまも合っていませんね。 さて、それはおいといて、既に指摘されているところですが。 > strncpy(buff[i].bango,in_buff,No_SIZE); > buff[i].bango[No_SIZE] = '\n'; は、in_buff の中身が、bango よりも長かったときの保険だと思いますが、普通は、 buff[i].bango[No_SIZE - 1] = '\0' です。 また、 > buff[i].ki = atoi(&in_buff[No_SIZE]); は、atoi() の引数の型は、char * なので、型としてはOKです。また、おそらく in_buffは、buff より長いので、in_buff[No_SIZE]はおそらく、in_buff の中の有効な領域です。 しかし、多分、作者の意図したとおりにはなっていないでしょう。

leak
質問者

補足

お返事ありがとうございます。 定義の部分は800字に収まらなかったので省いてしまいました。以下が定義の部分です。 #define No_SIZE 11 //識別番号の桁数 #define season_SIZE 3 //期の桁数 #define BUFF_SIZE No_SIZE + season_SIZE + 1 //読み込みバッファのサイズ #define ARRY_SIZE 10000 //構造体配列のサイズ >> strncpy(buff[i].bango,in_buff,No_SIZE); >> buff[i].bango[No_SIZE] = '\n'; >は、in_buff の中身が、bango よりも長かったときの保険だと思いますが、普通は、 >buff[i].bango[No_SIZE - 1] = '\0' です。 おっしゃるとおり'\0'が正しい記述でした。 それとこれがエラーのそのままの文です。 コンパイル中... Cpp1.cpp リンク中... Cpp1.obj : error LNK2001: 外部シンボル ""struct in_data * __cdecl q_sort(struct in_data * const,int,int)" (?q_sort@@YAPAUin_data@@QAU1@HH@Z)" は未解決です Debug/Cpp1.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー Cpp1.exe - エラー 2、警告 0 初心者なもので質問まともに聞けず申し訳ないです。

回答No.1

buff[i].bango[No_SIZE] = '\n';は、bango[]の限界以上のところに書き込んでますが、これはよいのですか?また、'\n' を設定する意図が分かりません。 buff[i].ki = atoi(&in_buff[No_SIZE]);のところは、なぜatoiに、文字へのポインタを渡しているのですか?しかも範囲外じゃないでしょうか?

leak
質問者

補足

お返事遅れました。 すいません buff[i].bango[No_SIZE] = '\n'; ではなく buff[i].bango[No_SIZE] = '\0'; でした。