- 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/ 【このスレ住人としての心得】 わざとスレ違いあるいはごく低レベルな質問を繰り返して 流れを妨害する荒らしがいます。適当に誘導して放置してください。
- 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にあるんだっけ?
- 785 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 15:36:26 ]
- まだバタバタしてますがこれ。
Initializer List www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm initializer-list constructorってのがあって(以下上の提案参照
- 786 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 21:27:50 ]
- C90に準じていても、それをゆるさない車載標準規約であるMISRA-C。
マジでうざい規約です・・・
- 787 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:21:01 ]
- >>785
かなりバタバタしてる雰囲気がするねw
- 788 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 09:28:51 ]
- union { char a[4]; int i } u;
というような共用体があったとき、 u.a[0]〜u.a[3]に代入した後、それをu.iで参照するのは未定義でしょうか? 6.5のeffective typeの説明を読む限りではそうなってしまいそうなんですが。 未定義でないとすると、その根拠は規格のどの辺で規定されています?
- 789 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 10:43:24 ]
- The effective type of an object for an access to its stored value ... ってとこ?
どこに未定義って書いてある?
- 790 名前:デフォルトの名無しさん [2009/03/29(日) 11:11:42 ]
- > 4. 規格合致性
> この規格では,このほかに,用語“未 > 定義の動作”を使うことによるか又は動作の明示的な定義を与えないことによって未定義の動作を示すこ > ともある。
- 791 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 11:13:29 ]
- >>788
参照はして構わない。値は未定義。
- 792 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 12:31:08 ]
- 多くの実装ではこちらが期待したとおりのビット列として読み出すことができる
しかし規格上は、ある型で与えた値を別の型で読み出せることは保障していない 結論:自己責任
- 793 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 12:49:17 ]
- >>792
実装の説明には書かれているものなのかな? たとえば、gccとか。
- 794 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 12:54:16 ]
- 規格で保証してないことを保証してるなら、書いてあることもある。
gccでは保証してないどころか、予想だにしない結果になるんじゃなかったっけ? -O2 とかだと。
- 795 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:04:43 ]
- いやalignとかpaddingとかオプションで指定できるし。> gcc
それにconfigureで確かめたり、実行時にassertしたりできるでしょ。 ただ何がやりたいのか不明だけど、勝手に想像すると、今時のマナーでは、 #include <stdint.h> union { uint8_t a[4]; int32_t i; } u; とするんじゃないのかな。
- 796 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:08:39 ]
- 何が今時なのか分からん。
- 797 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:12:49 ]
- sizeof(int) == 4と仮定しない方がいい→今時
- 798 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:13:10 ]
- >>796
サイズが同じなら、予想した動作になるってことかな?
- 799 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:13:53 ]
- charとuint8_tが等価なのも今時なのか?
- 800 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:18:32 ]
- 粘着乙
- 801 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:54:11 ]
- char だと 0x80 の値が使えないかもしれないジャマイカ
- 802 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:57:04 ]
- charが9ビット以上である可能性がな・・・
- 803 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:57:58 ]
- >>801
いや、もともとcharで切ってたならcharとしての使い方しかしないでしょ。 なんでuint8_tにするの?ってことなんだけど。
- 804 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 14:11:03 ]
- >>803
何言っているか意味がわからんが? > charとしての使い方しかしないでしょ。 ここはC++スレじゃないぜ?
- 805 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 18:55:14 ]
- C++が何で関係あるのか分からんが
もともとcharで切ってる事自体、 本当によく考え抜かれたものか怪しいことは確か
- 806 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 19:05:34 ]
- 結局 >>788 批判ですかw
- 807 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 20:06:01 ]
- C++が何で関係あるのか分からんやつは答えなくてよろし
- 808 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:02:11 ]
- みなさま、ご回答ありがとうございます。
intとcharは例が悪かったかも知れませんが、 相談の主旨は union U { t1 m1; t2 m2; } u; (ただしt1とt2はcompatibleでない) に対して、u.m1に書き込んだ値をu.m2で読み込んだときの 言語仕様についてでした。 例だと、 uの表すobjectのeffective typeはunion U u.m1の表すobjectのeffective typeはt1 u.m2の表すobjectのeffective typeはt2 になるわけですが、u.m1とu.m2の表すobjectが同じものと考えれば、 1つのobjectがt1とt2という2つのeffective typeを持つ。 だから、u.m1に書き込んだ値をu.m2で読み込むのは許される。 ただし、読み込まれる値については未規定である。 という理解でよいのでしょうか?
- 809 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:29:36 ]
- そだね。
- 810 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:32:37 ]
- CとC++でcharの扱いが全く違うことは、
まあスレ違いなんで知らなくてもいいけど、 Cのcharがintegral typeでintegral promotionの対象、 ANSIでも"as is"が認められているだけってことは知っておかないと。
- 811 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 23:44:30 ]
- >>809
適当なことを言わないように
- 812 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 08:00:10 ]
- Cの言語仕様というと、俺はいまだにK&Rなんだが。
- 813 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:59:50 ]
- >>788
どうせおもいっきり環境依存なんだから、 面倒なことしないで、 char a[4]; にセットして *(int*)a で読んじゃえ。
- 814 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:08:51 ]
- >808
> になるわけですが、u.m1とu.m2の表すobjectが同じものと考えれば、 とあるが、共用体のメンバに対応するオブジェクトはすべて同じなのか? 大きさも型も違うのに。 むしろ同じアドレスだけど、オブジェクトは別と考えるのが自然だと思う。
- 815 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:15:21 ]
- static_assert(期待通りの値が入ってるかどうか) をどっかに入れておけばいい。
- 816 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:15:40 ]
- >>813
strict aliasing rule違反じゃね?どうなの?
- 817 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:30:28 ]
- >>816
大丈夫なCPUとダメなCPUがある。 x86系は大丈夫。 逆の方が適用可能な範囲が広いか。 int a; を ((char*)&a)[0〜3] で書く。
- 818 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 02:58:14 ]
- >>816
違反。 逆に int a; を用意して (char*)&a 経由でセットし、その後 a を読むのなら OK 。
- 819 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:23:29 ]
- なんでC言語には累乗計算の為の演算子がないのですか?
- 820 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:43:38 ]
- 累乗計算命令を積んでるCPUが少ないからだ
|

|