1 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:52:45 ] このスレは標準C規格や規格に合致した移植性の高い記法・技法に関するスレです。 C言語初心者の初歩的な質問、GUIなどの標準Cではできない事の質問、 ソース丸投げ、宿題、書籍 などは専門の別スレッド↓があるのでそちらへ。 C言語なら俺に聞け(入門篇) Part 24 pc11.2ch.net/test/read.cgi/tech/1201083176/ 【初心者歓迎】C/C++室 Ver.47【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1200464091/ C/C++の宿題を片付けます 103代目 pc11.2ch.net/test/read.cgi/tech/1200318925/ 【書き込む前に】 ・まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 ・質問する前には最低限検索を。 ・エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。 【参考文献】 C FAQ 日本語訳 www.kouno.jp/home/c_faq/ Cプログラマ必読 ・プログラミング言語C(通称 K&R) www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244 【このスレのログ】 前スレ:pc11.2ch.net/test/read.cgi/tech/1190261457/ 他の過去ログ:nssearch.hp.infoseek.co.jp/clang/ 【このスレ住人としての心得】 わざとスレ違いあるいはごく低レベルな質問を繰り返して 流れを妨害する荒らしがいます。適当に誘導して放置してください。
684 名前:680 mailto:sage [2009/02/14(土) 22:52:12 ] >>683 その文章は知ってるよ。 でもそれは toupper の引数は unsigned char でキャストしろ、って意味.じゃない signed char を指定した場合で -2 〜 -128 の場合は undefined だよ、って言ってるだけ (EOFが-1として)
685 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 00:14:28 ] 実際死ぬケースもあったな。マイナス与えると。 日本語扱うとよくある。
686 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 00:16:35 ] > 未定義動作も実装依存も回避した移植性のある方法はあるのでしょうか? 最初っから全部unsigned charにしとけでイナフ
687 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 00:23:38 ] >>679 についてはどうなんだ?
688 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:03:33 ] >>684 未定義動作を回避するのに、 unsigned char にキャストするほかにどうすんの?
689 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:06:46 ] >>679 basic character set に無い処理系依存の拡張文字の char としての値について、 符号も含めて規定は無いから、負の値が拡張文字に対応しても問題なさそう。 6.2.5 Types p3 > An object declared as type char is large enough to store any member of the basic > execution character set. If a member of the basic execution character set is stored in a > char object, its value is guaranteed to be nonnegative. If any other character is stored in > a char object, the resulting value is implementation-defined but shall be within the range > of values that can be represented in that type.
690 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:11:07 ] >684 じゃ、 > signed char を指定した場合で -2 〜 -128 の場合 はどうすれば? 範囲チェックして toupper には渡すなって主張? >687 0〜255 だというなら確かにそうかもね。 > 9899:1999 6.2.5/3 > If a member of the basic execution character set is stored in a > char object, its value is guaranteed to be positive. If any other character is stored in a > char object, the resulting value is implementation-defined but shall be within the range > of values that can be represented in that type. という記述を見ると basic execution character set 以外なら負値も認めているように読めるけど、 後は実装依存の闇の中、かな。
691 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:22:17 ] int toupper(int c);
692 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:22:20 ] なるほど・・・。 完全に環境無依存のコードは無理っぽいね。
693 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:55:08 ] 卓上の妄想なら不可能だが、現実的にはみんなやってるだろ
694 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:59:26 ] なんで文字を扱ってるのに符号を気にしなきゃいけないんだよC言語のバカ!
695 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 02:11:42 ] char の符号が未規定なのって どんなケースを想定してのことなのだろうか。 符号つきの文字コードがあったらいけないから?
696 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 02:18:33 ] 8 bit 符号付でも ASCII の表現には十分だから実装任せで良いよね。 っていう話だと思う。 C++ では char を受けて char を返す toupper/tolower があるから、今さら 規格を変更する(変更を検討する)モチベーションも無いだろうしなぁ。
697 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 04:13:14 ] リアルタイムの人間じゃないけど。 規格がまとまる前にsigned, unsigned両方の実装が出ていたから、 というのが最大の理由だったと思う。 そこから先は>>696 のとおり。
698 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 09:07:58 ] int は、ディフォルトで signed なのに、char のディフォルトを決めなかったのが 敗因だと思う。 まあ今時だとメモリも潤沢だからわざわざ char に詰め込もうなんて思わないけど、 当時だと short short int の役目もあったのかもしれないな。
699 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 10:18:39 ] MS-cがオプションでcharをアンサインドにできる仕様だったからねぇ。 intとは事情が違うね。
700 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 10:52:13 ] lattice-c(2のころ)はunsignedだったっけ?
701 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 11:12:02 ] >>688 出力を未定義にしたくないなら、未定義にならない引数を与えろってこと。 toupper呼ぶ前に、入力文字の範囲チェックしないってことは無いだろう普通 それを unsigned char へのキャストで済ませられたらいいな、と 考えたのだろうけどそれじゃダメって話
702 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 11:29:04 ] >>701 範囲をどうチェックするするべきだと言うの? チェックで範囲外だとわかったらどうしろっていうの? toupper() に渡さないと大文字にできんのだが。
703 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 12:16:42 ] 馬鹿なの? 大文字にしたければ小文字を渡せよ if( isascii(c) && islower(c)) c = toupper(c); これを c = toupper((unsigned char)c); とすると規格上不定になります(;_;)とか言ってるから キャストするからだろ馬鹿、って言ってるんだ
704 名前:デフォルトの名無しさん [2009/02/15(日) 12:23:28 ] 大馬鹿なの? toupper の前に islower なんかいらねーよ
705 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 12:23:30 ] >>703 標準の範囲で実装依存せずにどうするかって話なのに、 非標準の isascii() とか入れてみたり勝手に ASCII 大文字だけに要求を絞ったり、 ギャグでやってるのか?
706 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 12:37:08 ] いいえ、ボールギャグです。
707 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:08:42 ] で、実際のところa-z|A-Zが符号付き表現で負になることはありえるの?
708 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:11:34 ] それは知らないけど、 "C" locale以外ではa-z|A-Z以外でもislower/isupperが真になるということなら有り得ると思う。
709 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:12:31 ] 真になるってどういう事だよ。
710 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:13:04 ] あ、空目してた。ごめんよ。
711 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:14:32 ] 結局は>>686
712 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 16:26:35 ] >>707 そいつらは basic execution character set に入ってるから char 型の符号の有無に かかわらず負にならないことが保証されてる。 ( >689,690 が引用してる箇所参照)
713 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 17:39:56 ] >>712 素朴な疑問、EBCDIC な文字コードの処理系の場合どうなるんだ?
714 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 18:09:27 ] >>713 文字コードは関係ない。( >689,690 が引用してる箇所参照)
715 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 18:30:21 ] >>714 EBCDIC って 8bit だと MSB たってんじゃん, char 9bit 以上で実装しろって話?
716 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 19:33:50 ] >>699 MS-C はシフトJIS でトラブル奴が多いからそういうオプションを サポートしただけだろ。
717 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 19:35:12 ] >>715 EBCDIC のコードを 8 bit char の値に使うなら char 型を unsigned にするしかないということ。
718 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 20:08:24 ] >>717 fgetsやprintfやstrcmpなどの型も全部変更するの?
719 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 20:11:42 ] >>718 きっと何か勘違いしてると思うけどそれらの関数でどういう問題が起きると思うの?
720 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 21:19:58 ] >>718 unsigned charにするんじゃなくて、 char自体を符号無しにするってことだろ。
721 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 22:46:22 ] >>717 ああ、それなら納得 「>>712 char 型の符号の有無にかかわらず負にならない」 てな、書き方はやめてほしかった
722 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 04:13:51 ] 今現在、charをsignedで使う意味ってあるのかな。
723 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 15:09:34 ] >>722 charを文字ではなく数値として使うこと考えれば。 intへの昇格も考えなきゃならんし。
724 名前:デフォルトの名無しさん [2009/03/01(日) 00:55:23 ] C言語なら俺に聞け(入門篇) Part 45 pc11.2ch.net/test/read.cgi/tech/1235044065/l50 こっちが埋まったんで、とりあえずageておく。
725 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 03:16:58 ] あのグダグダを持ち込まれても困るんだが
726 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:51:47 ] ネタ切れ? じゃぁ 問題: int i, j; int main() { i = 1; j = i++ * i++; printf("%d, %d\n", i, j); } このプログラムを実行するとどうなるか? どうなるべきか? 結果もしくは挙動を推測せよ。 (includeとかmainの型なんかは、適宜補え。文句言うな)
727 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:17:00 ] jの右辺が未定義動作だから何が起こるかわからない 「3,6」と表示されるかもしれないし「3,9」と表示されるかもしれないし 「5196823, -98600289」と表示されるかもしれないし「qあwせdrftgyふじこlp;」と表示されるかもしれないし プログラムが異常終了するかもしれないしOSがクラッシュするかもしれないし PCが火を噴くかもしれないし地球が爆発するかもしれないし鼻から悪魔が出てくるかもしれない 常識だと思うが、今更どうした
728 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:54:37 ] mainが値を返してないからコンパイルできない
729 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:56:00 ] C99なら可だが
730 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 11:15:52 ] 鼻から悪魔は無いな、たぶん。
731 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 20:09:45 ] 出てきてからじゃ遅いんだよ、出てきてからじゃ。
732 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 21:31:38 ] ネタ切れ? じゃぁ 問題: int a[32], b[32], *p = a; if (p < b || b + 32 <= p) printf("悪魔が出る。"); else printf("いずれにせよ悪魔が出る。"); このプログラムの断片について議論して。前後は適当に補ってね。
733 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 21:50:06 ] どこにも悪魔は出ないだろ・・・ b + 32 は脱参照しなければ合法だし ポインタは順序付け可能だ(どういう順序になるかは未規定だが)
734 名前:デフォルトの名無しさん [2009/03/02(月) 21:55:05 ] p < b の大小関係が未規定ゆえ、結果が未定義となる
735 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:14:11 ] どういう順序になるかは未規定だが 順序付け可能とは定義されてるよ
736 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:14:47 ] 結果は未定義じゃなくて未規定 少なくとも鼻から悪魔は出ない
737 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:17:06 ] When two pointers are compared, <ばっさり省略> In all other cases, the behavior is undefined.
738 名前:デフォルトの名無しさん [2009/03/02(月) 22:24:43 ] 未規定の動作が生じうる可能性のうちのいずれかに依存したコードには可搬性があるというのか?
739 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:25:46 ] ばっさり省略しすぎだろwww 同じ型なら比較可能だ
740 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:28:54 ] >>739 俺も今6.5.8をみていたところだが > 同じ型なら比較可能だ これはどこに書いてある?
741 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:29:03 ] >>739 同じ型でも違うオブジェクトであればだめだよ。
742 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:40:59 ] ああ、Cだとダメなのか。 C++だといいからCでもいいのかと思った。
743 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 21:56:44 ] >742 C++ でも駄目だろ、と思ったけど未規定なのな。 そして std::less とかだと全順序保証、と。
744 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:43:13 ] Cだとポインタを二分探索木で管理するには その先の値を見るしかないのか。 その先の値の順番に特に意味が無くても。
745 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:54:51 ] >>744 先の値の順番に意味がなかったらなにを基準に木構成する気だ
746 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 11:51:54 ] ポインタのアドレスそのもので探索する?
747 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:05:25 ] 連続メモリ空間上のポインタなら二分木で管理するまでもないし そうでないなら比較の保障がない以前に意味がないだろ
748 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:05:56 ] ×空間上のポインタ ○空間上へのポインタ
749 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 22:25:15 ] >>744 この世にはデリファレンスできないポインタも存在するわけだが。
750 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 23:54:43 ] int にキャストして比較すれば良いんじゃない
751 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 23:56:45 ] そしてオーバーフローするんですね、わかります
752 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 10:58:14 ] >>750 その比較が意味のあるものとなる保障はない。 それに>>751 がいうようにintじゃだめだろう。
753 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:11:20 ] ポインタをポインタと同じサイズの整数型に変換可能な事は保証されてるから uintptr_t 使うならええんでないかい?
754 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:14:22 ] それなら問題ないよ。
755 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 12:06:23 ] double v; としてvがnanやinfinityであるかを判定するにはどうやるんでしょうか? 標準ライブラリ見てもそのような関数が用意されてないので困っています。 v!=vでnanなのは分かっているのですが、他に方法はないのでしょうか。 それと、実数のときと複素数のときの判定方法を教えてください。 一応GCCです。
756 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 12:33:17 ] >>755 -std=c99 でisnan、isinfあたり。
757 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:06:48 ] c99にすれば用意されているのですが、コンパイラ・オプションで指定しないと標準ではinf, nanは判定できないって事ですか?
758 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:20:38 ] >>757 いちおう、 C99 は「標準」だよ。 gcc のデフォルトは C99 じゃないけど、拡張の一部として isnan, isinf は 使えたりするかもしれない。っていうか、試せばいいよ。
759 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:40:11 ] そういえばinfinityの判定はやったことなかったけど、今までみんなはどうやってたんだろう・・
760 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:42:21 ] >>756 に書いてあるじゃんw
761 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:54:44 ] 古いAPIを読んでたのでなかったんですが、今後はコーディングするときはC99準拠で必ずやることにします。
762 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:02:39 ] 昔も標準でなかっただけで普通にあった。 isinfinity()の環境もあった。 > 今後はコーディングするときはC99準拠で必ずやることにします。 素晴らしいです。
763 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 10:12:15 ] restrictとか可変長配列とか勝手に使うと迷惑になることもあるから気を付けろよ 個人ならいいけど
764 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 14:04:37 ] >>763 kwsk
765 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 13:18:20 ] >>764 c99ではrestrictは予約語。iccだとオプションを指定すればc++でも使える。
766 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 16:59:58 ] ところで今の規格準拠コンパイラは複素数のinf, nanを判定できるのか?
767 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 01:41:09 ] Cに複素数なんて概念あったっけ?
768 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 05:50:48 ] >>767 c99
769 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 06:37:18 ] いい加減、このスレの参加資格に、C99の規格書を読むことを入れとこうぜ
770 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 09:36:52 ] まあseclan.dll.jp/c99d/ くらいは参照した方がいいかと。
771 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 09:48:37 ] 確かに2009年にもなってC99を知らんのはこのスレ的にはお断りだ Cを知らないに等しい
772 名前:デフォルトの名無しさん [2009/03/28(土) 09:50:19 ] 旧規格もそうと断ったうえでなら可だろ 事実上まだ現役だし
773 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 10:24:27 ] C99を実際には使わなくても 知っていなくてはこのスレにいる資格は無いな
774 名前:デフォルトの名無しさん [2009/03/28(土) 10:34:44 ] まあ複素数は置いといて、何かを知らないことをもって C99 を知らないことにされたら 資格者ほとんどいないんじゃね?
775 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 10:49:42 ] 今規格をあたろうとすると必然的にC99になるからそうでもないと思うが
776 名前:デフォルトの名無しさん [2009/03/28(土) 10:58:12 ] それなら C99 を「知っている」のではなく「規格票にアクセスできる」ことが資格というべきではないか?
777 名前:デフォルトの名無しさん [2009/03/28(土) 10:59:29 ] # 今日はここまで、遊びに出かける
778 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 11:00:14 ] でも最低でも>>770 くらいのことは知っておいて欲しい
779 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 12:46:04 ] コンパウンドリテラルとか便利だけどね。 ただどれがGCC拡張か規格機能なのかよく分からないことがよくある。 それよか、API文章をC99対応にしないと広まらないだろう。 とくにMSDNが率先してC99に対応しないとGNU方面の人たちだけになるんじゃないか? MSはカオスだしそのうち空中分解しそうだけど。
780 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 13:42:40 ] >>779 > MSはカオスだしそのうち空中分解しそうだけど。 突然それまでの話と関係ない一言を最後に入れるあたり、天声人語かと思った
781 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 13:58:20 ] コンパウンドリテラルはC++にも欲しい
782 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 14:24:48 ] コンストラクタ主義と コンパウンドリテラルは合わない。 デフォルトコンストラクタのみなら、 リスト初期化子の記法で何とかなりそうではあるけど。
783 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 14:28:01 ] 配置newで乗り切る。
784 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 15:09:28 ] 配列のコンパウンドリテラルの代わりになるものは C++0xにあるんだっけ?