- 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/ 【このスレ住人としての心得】 わざとスレ違いあるいはごく低レベルな質問を繰り返して 流れを妨害する荒らしがいます。適当に誘導して放置してください。
- 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が少ないからだ
|

|