- 1 名前:デフォルトの名無しさん [2007/02/01(木) 23:08:46 ]
- このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 質問する前には最低限検索を。 エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。 C FAQ 日本語訳 www.kouno.jp/home/c_faq/ Cプログラマ必読 ・プログラミング言語C(通称 K&R) www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244 他の過去ログはここに nssearch.hp.infoseek.co.jp/clang/ 前スレ 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130 pc10.2ch.net/test/read.cgi/tech/1159613789/ GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は 専門の別スレッド↓があるのでそこへさようなら。 【初心者歓迎】C/C++室 Ver.34【環境依存OK】 pc10.2ch.net/test/read.cgi/tech/1169039760/ C/C++の宿題を片付けます 82代目 pc10.2ch.net/test/read.cgi/tech/1169575464/
- 136 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 23:25:41 ]
- ないんですか。道理で検索しても出てこなかったんですね。
memcpyから自作してみます。ありがとうございました。
- 137 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 23:35:04 ]
- っていうかいつからsubstrはC++の標準になった?
- 138 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 23:40:41 ]
- 最初にISOで規格化されたときから
クラステンプレートstd::basic_stringの非静的メンバ関数になっている。
- 139 名前:デフォルトの名無しさん mailto:sage [2007/02/14(水) 23:43:01 ]
- >137
(゚д゚)
- 140 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:27:58 ]
- >>134
memcpy()なんぞ使わずに、こんな関数でも用意しろ。 char * substr(char * buf, const char * str, int pos, int n) { sprintf(buf, "%.*s", n, str + pos); return buf; }
- 141 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 01:37:12 ]
- >>140
関数用意するのはいいとして、こんな処理に sprintf() は高すぎる。 ここは memcpy() の出番だろ。
- 142 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 06:40:40 ]
- | | 人| |
| | (_ .| | | | strncpy → .(・∀|_| |_|ω・`) ←strncat (⊃ |糞| |質|と ) |∧.| ̄| | ̄|u'
- 143 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 06:47:18 ]
- >>142
いいの、おまえらはカスだから。
- 144 名前:デフォルトの名無しさん mailto:sage [2007/02/15(木) 23:38:34 ]
- strncpyはともかく、strncatをカスと言うな
- 145 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 23:25:42 ]
- 質問です
4バイト(32bit)で1が立っているかどうかを、1ビットずつ判定していきたいのですが、 for( i=0 ; i<32 ; i++ ) { if( (unsigned long)abc & (1<<i) == 1<<i ) { } } こんな感じでいいでしょうか? 全然違うぞとかアドバイスありましたらよろしくお願いします。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 23:41:51 ]
- 間違ってはないけど
if (abc & (1<<i)) { } で十分じゃね
- 147 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 23:42:55 ]
- >>145
キャスト要らない。 1 だと int なので、符号ビットなど移植性を考えると 14 回までしか左シフトできない。 マスクした結果は 0 と比較したほうが効率がいいし、ソースが簡単にできる。 ってことで if( (abc & (1UL<<i)) != 0 ) または if(abc & (1UL<<i)) あたりがお勧め。
- 148 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 23:49:55 ]
- あれ << って算術シフトだっけ?
1 << i だったら最上位ビットは動かないのか
- 149 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 00:10:41 ]
- >>148
この場合は負の数が関係なので符号ビットとか言ったのは混乱の元だった。 ごめん。 どの環境でも保証されている INT_MAX の最小値は 32767 なので、 16384 になる 1 << 14 までしか移植性のある動作は保証されない。 それ以上シフトすると未定義動作になる。 1UL だと型が unsigned long になり、 ULONG_MAX の最小値の定義は 4294967295 なので 2147483648 になる 1UL << 31 まで大丈夫。
- 150 名前:145 [2007/02/18(日) 00:27:04 ]
- みなさんありがとうございます
言われてifの使い方調べて勉強になりました。 if(a) a≠0:真 a=0:偽 なので !=0や==0を省略できるのですね あとULですが、どの環境でも使えるものなのでしょうか?
- 151 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 00:33:45 ]
- >>150
整数リテラルのサフィックス UL は標準。どこでも使える。
- 152 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 02:09:52 ]
- あと>149が言い忘れてるけど、移植性考えるならabcもintではなくunsigned longで定義すること
- 153 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 03:36:36 ]
- abc のコピーを順次右シフトして 1 と and を取れば 1 の型を気にする必要なんかないのにな
- 154 名前:145 mailto:sage [2007/02/18(日) 06:11:09 ]
- 多くのアドバイスありがとうございます。
int i ; unsigned long abc ; if( (abc & (1UL<<i)) != 0 ) または unsigned long saveabc ; saveabc = abc ; if( ((saveabc>>i) & 1) != 0 ) こんな感じでどうでしょうか?
- 155 名前:145 mailto:sage [2007/02/18(日) 06:18:55 ]
- 下のsaveabcは意味ないですね・・・コピーを順次右シフトどうやるんでしょう
- 156 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 06:30:43 ]
- >>=1
- 157 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 06:33:17 ]
- saveabc=abc;
for (i+......) { if (saveabc & 1) { ... } /* 最下位ビットのみチェック */ /* チェック対象自身を右シフトしてしまえー */ saveabc >>= 1; /* saveabc = saveabc >> 1; */ } 順次右シフトは、上記を示唆してるんだと思うよ
- 158 名前:145 mailto:sage [2007/02/18(日) 13:16:34 ]
- なるほど、どうもありがとうございました
- 159 名前:145 mailto:sage [2007/02/18(日) 13:30:49 ]
- すみません今思いついたのですが、
int i ; unsigned long abc ; for( i=0 ; i<32 ; i++ ){ if( (abc>>i & 1) !=0 ){...} } これだとabcはunsigned longだし右に31シフトもできますでしょうか?
- 160 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 13:33:40 ]
- >>159 問題ない。
- 161 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 15:07:39 ]
- ・ abc>>i & 1
・ abc & 1<<i ・ copyabc & 1 ... copyabc>>=1 ・ mask=1 ... abc & mask ... mask<<=1 abcの値がその後必要ないなら ・ abc & 1 ... abc>>=1 も使える
- 162 名前:145 mailto:sage [2007/02/18(日) 15:46:30 ]
- 大変勉強になりましたm(__)m
ありがとうございました
- 163 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 20:56:53 ]
- free()でメモリ領域を解放する時、何故解放するメモリ領域へのポインタだけで解放できるんでしょうか?
解放するメモリ領域のサイズも必要な気がするのですが。
- 164 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:25:58 ]
- >>163
その情報をポインタだけで引き出せるように管理しているから。 malloc/freeの実装の一例はK&Rに載ってる。 もちろんこれは一例で他にも実装方法はある。
- 165 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:51:42 ]
- 回答ありがとうございます。
malloc()したときに割り当てた領域へのポインタとサイズを一緒に記録しておいて free()するときに引数として渡されたポインタを元に割り当てた領域のサイズを計算して解放するというような感じですかね? K&R持ってないので買って読んでみます。
- 166 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:03:57 ]
- >>165
そういう実装もあると思う。 K&Rのやり方は、 ・mallocするときに管理用ヘッダ+要求されたサイズのメモリを確保 ・mallocは管理用ヘッダのサイズ分アドレスを進めたポインタを返す ・freeは渡されてきたポインタから管理用ヘッダのサイズだけ戻して管理情報を得る ・各メモリ領域はリンクポインタで辿れるようになっている という感じの実装だった(はず。今手元に本がない)。
- 167 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:07:11 ]
- >>166
空き領域の線形リストで、渡されたポインタで挟まれる部分を探す方式でなかったっけ? K&R 探すか
- 168 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:15:24 ]
- >>167
うーん、そうだったかもしれない。ごめん。
- 169 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:18:11 ]
- >>168
いやいや。 俺も記憶だけで書いてるから… >>165 とまあ、なんとかしてポインタから領域情報をひねりだしてるですよ
- 170 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 17:55:41 ]
- ちょっとK&R引っ張ってくる
- 171 名前:デフォルトの名無しさん [2007/02/24(土) 17:08:02 ]
- 標準化される前(つまりC89以前)の文字列リテラルの型はなんでしょうか?
現行規格では static char[] 型 です。
- 172 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:13:48 ]
- staticはautoなんかと同じ記憶クラス指定子だから、変数を修飾していて、型を修飾してるわけじゃないよ
- 173 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:18:06 ]
- まあでも静的記憶期間だと言いたいことはわかる
- 174 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:24:15 ]
- 標準化される前は処理系依存なんだからその質問は無意味な気がするが
- 175 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:29:41 ]
- sizeof("ab") == sizeof("cde") が真ならchar*で、偽ならchar[]なんじゃね?
*"" = '\0'; でソレっぽいコンパイルエラーが出るならconstなんじゃね?
- 176 名前:171 [2007/02/24(土) 17:34:48 ]
- 標準化される前だから >>174 の言う通りですね、、、
- 177 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:03:14 ]
- >>175
真っ赤な嘘書くなや。
- 178 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 01:33:02 ]
- ところで、文字列リテラルの型がなんであるのかを知りたい理由が聞きたいんだが
- 179 名前:171 [2007/02/25(日) 20:06:13 ]
- >>178
sizeof("1234567890") は char[11] のサイズか char* のサイズかを知る為 現行規格では char[11] のサイズ 11 になる 標準化前については、処理系依存で納得です。
- 180 名前:171 [2007/02/25(日) 20:09:09 ]
- >>179
補足 標準化される前は 文字列リテラルの型は char* だと某所で見た。
- 181 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 20:17:40 ]
- >>179
いやそうじゃなくて、文字列リテラルの型を知って それを何に応用出来るの?って話だと思うぞ。 豆知識?
- 182 名前:171 [2007/02/25(日) 20:20:32 ]
- >181
だから 標準化前の sizeof("1234567890") の値を知る為。 その為に文字列リテラルの型が必要 でも処理系依存で納得した。
- 183 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 20:21:50 ]
- >>182
無限ループになりそうだからもうやめとく。
- 184 名前:171 [2007/02/25(日) 20:24:12 ]
- >>183
>>178 には「知りたい理由」 とありますが? 「何に応用出来るか?」とは書いてません。
- 185 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 20:30:16 ]
- くだらね
- 186 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 21:46:09 ]
- 変なのにからまれて、171 の中の人も大変だな。
- 187 名前:178 mailto:sage [2007/02/25(日) 22:20:33 ]
- わかったわかった言い直すよ
どうして sizeof("1234567890") の値を知りたいのか教えてくれ
- 188 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:02:42 ]
- >>182
逆ではないのか? 文字列リテラルの型を間接的に測る手段としてsizeofを使うんだろうが。
- 189 名前:デフォルトの名無しさん [2007/02/25(日) 23:13:57 ]
- ファイル操作に関して質問です。
GB単位のファイルを処理しているんですが ファイルの一部を上書きする標準関数てあるのでしょうか? あと指定した位置から後ろ全てを削除するような関数も探してます。
- 190 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:15:27 ]
- fseekして書き込めばいいんじゃないかな
- 191 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:17:05 ]
- ググればサンプルも見付かるよ。
- 192 名前:189 [2007/02/25(日) 23:27:21 ]
- fseek して fwrite ということですね!
ありがとうございます。 ファイルの後半を削るというのはやっぱり無理なんでしょうか?
- 193 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:31:32 ]
- Cの標準ライブラリではそういうことするのはないな。
Windows限定だったらSetEndOfFileなんてものもあるけど。
- 194 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:39:19 ]
- UNIXならtruncateか。
- 195 名前:189 mailto:sage [2007/02/25(日) 23:41:21 ]
- ありがとうございます。
fseek で調べたら上書きができるということはわかりました。 ただ挿入というようなことはできないと考えてよいのかな? 後半削除はないのですね。 ということは実現するには必要な部分だけファイルコピーということですね。 Windows 限定のコードではないので残念です。 差分とメタデータ使って実現するしかなさそうだな・・・。
- 196 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:41:47 ]
- 0バイトをwriteするとそこから先が削れる場合もあるけど
処理系依存(そもそもwrite自体が処理系依存だが)
- 197 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 00:13:07 ]
- stdioでできることは、
ファイルを作ること ファイルをリネームすること ファイルの任意の位置から読むこと ファイルの任意の位置に書くこと だけで、ファイルのサイズやレコードのオフセットを変更することはできない。 というかそれらはファイルの中身ではなく、ファイルの管理方法に関わることなので、 必然的に処理系のファイルシステムに依存する。 ありとあらゆる環境で動作することを保証したいなら、 それはファイルをまるごと読んで必要な構成で別ファイルに書き出し 元ファイルを消してから元の名前にリネームするしかない。 ある程度ターゲットの環境が決まっていて、それぞれに有効な環境依存の技があるなら、 それぞれの環境のためのコードを書いて、プリプロセッサで処理系に適合させるのが有効。
- 198 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 04:57:47 ]
- そういうファイル処理するプロセスを環境ごとに作り、主プログラムからはそれを呼び出すというのも一つの手。
- 199 名前:171 [2007/02/26(月) 19:52:50 ]
- >>187
某所で、その話題を見たから気になっただけ。 >>188 確かにそうですね。
- 200 名前:デフォルトの名無しさん [2007/02/28(水) 15:50:13 ]
- C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
- 201 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 16:11:58 ]
- >>200
楽しいか?
- 202 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 00:55:09 ]
- >>201
C++相談室の「STLを使うと」から始まるコピペみたいに テンプレ化せんとダメなんかなぁ?
- 203 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 22:32:01 ]
- ANSI Cの仕様について質問です。
mainはANSI Cではint main(void)またはint main(int argc, char *argv[]) と決まってるけど K&Rではmain()となっていて戻り値intと引数voidを省略していますよね? これもANSI準拠と言えるんでしょうか?
- 204 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 22:50:07 ]
- >>203
戻り値の省略はANSI準拠でない
- 205 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:56:49 ]
- JIS X 3010では
関数定義: 宣言指定子列opt 宣言子 宣言並びopt 複合文 宣言子: ポインタopt 直接宣言子 直接宣言子: 識別子 ( 宣言子 ) 直接宣言子 [ 定数式opt ] 直接宣言子 ( 仮引数型並び ) 直接宣言子 ( 識別子並び ) だからmain()は許されてるように読めるけど。どこかで明示的に禁止されてたっけ?
- 206 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:57:22 ]
- 識別子並びの後ろにoptが抜けてた。
- 207 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:58:24 ]
- >>203だと関数定義なのか関数宣言なのか曖昧だな
- 208 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 00:16:26 ]
- Cの場合は省略時はintじゃなかったっけ
C++は確かダメだったような
- 209 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 00:18:29 ]
- 許されてはいるけど、
コンパイラによっては警告が出るから鬱陶しい。
- 210 名前:デフォルトの名無しさん [2007/03/10(土) 02:33:54 ]
- よくqsortに渡す関数ポインタを
int cmp(int* a,int* b) { return *a-*b; } と書いてるサイトを見かけるんですが、これは qsortのプロトタイプの int(*func)(const void* a, const void* b)) と関数ポインタの互換性が無いと思うんですが、これはアリなんですか?
- 211 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:36:13 ]
- >>210 ダメ
- 212 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:41:41 ]
- intの配列ならこうだな
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }
- 213 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:41:50 ]
- >>210
それはオーバーフローを起こすアホコードだから絶対に真似しちゃダメ。
- 214 名前:210 mailto:sage [2007/03/10(土) 02:43:22 ]
- >>211
ですよねぇ・・・ 更には return *a-*b; も何かやばい感じがするんですが aに大きい負数が渡されるとおかしな事になるような・・・
- 215 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:43:29 ]
- >>212 もアホ確定。
- 216 名前:デフォルトの名無しさん [2007/03/10(土) 03:06:11 ]
- 多分、このスレの前スレで、Linuxのカーネルソースは
$ lint 〜 にパスしないと受け付けられない、みたいな書込みがあったように思うのですが、 この「〜」の部分のオプションが分かる方いらっしゃいますでしょうか?
- 217 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 03:46:02 ]
- サイトからソースを取得するプログラムについて質問したいのですが・・・
誰かいますか??
- 218 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 03:47:05 ]
- >>217
環境依存スレへどうぞ。
- 219 名前:デフォルトの名無しさん [2007/03/12(月) 23:00:34 ]
- ANCI C言語辞典だと
return *a-*b;みたいな書き方してるけど この辞典のサンプルソースはあてにならん int型の配列のqsortの比較関数は下のような 感じになるんじゃないかな int int_cmp(const void *a, const void *b) { if (*(int *)a < *(int *)b) return (-1); else if (*(int *)a > *(int *)b) return (1); return (0); }
- 220 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:16:43 ]
- int int_cmp(const void *a, const void *b)
{ return *(int *)a == *(int *)b ? 0 : ( *(int *)a > *(int *)b ? 1 : -1 ); }
- 221 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:21:23 ]
- やはり、intを返すという基本設計がまずいな。
- 222 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:23:46 ]
- >やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。 >やはり、intを返すという基本設計がまずいな。
- 223 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:28:40 ]
- よし、doubleを返すようにすればいいんだな!
アホかい
- 224 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:42:35 ]
- えーとじゃぁオレchar返すよ
- 225 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:43:55 ]
- たぶん彼は3値論理の型が欲しいと言っているんだろう
- 226 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:58:36 ]
- #define UNDER -1
#define EQUAL 0 #define OVER 1
- 227 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 05:33:23 ]
- そこはenumだろ常識的に考えて
- 228 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:17:15 ]
- _Bool返せよ。
- 229 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:39:41 ]
- おまえからそんなもの借りてないよ
- 230 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:44:58 ]
- >>228
_Boolじゃ3種類の値は返せないだろ
- 231 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:47:54 ]
- 別に3種類も返す必要ないだろ。
- 232 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:52:19 ]
- qsortの比較関数か? なら最低3値返す必要があるよ。
- 233 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:55:27 ]
- クィックソートは3値ないとアルゴリズム的に実行不可能なわけ?
- 234 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:56:51 ]
- アルゴリズム的に実行不可能という意味がよくわからないけど、
qsortの仕様がそれを要求している。それだけ。知らなかったの?
- 235 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 07:09:43 ]
- >やはり、intを返すという基本設計がまずいな。
という流れできてるんだけど・・・・・・
- 236 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 07:42:29 ]
- >>233
C++のstd::sort()の場合、要求してるのは2値(bool値)のPredicateだし 別に不可能ってわけじゃない。 例えばcmp() は a > b ならtrue, さもなくばfalseを返すという仕様であると して、もし同値かどうかの判定が必要であれば、 cmp(a,b)、cmp(b,a)の両者がfalseならば a == b と判断できるわけで。 >>234の言うように、C標準のqsort()の仕様が3値の比較関数を求めている ってだけだ。
|

|