2012年3月プログラム159: 【初心者お断り】ガチ規格準拠C専用スレ Part134 (201) TOP カテ一覧 スレ一覧 2ch元 削除依頼
初心者向け新言語 Small Basic スレ (240)
日下部陽一著 作ってわかるCプログラミング(第6版) (524)
Microsoft IronPython 1.0 (837)
プログラマー的"女の口説き方" (709)
くだすれDelphi(超初心者用)その54 (239)
プログラム板自治スレッド その4 (701)

【初心者お断り】ガチ規格準拠C専用スレ Part134


1 :09/06/28
このスレは標準C規格や規格に合致した移植性の高い記法・技法に関するスレです。
C言語初心者の初歩的な質問、GUIなどの標準Cではできない事の質問、
ソース丸投げ、宿題、書籍 などは専門の別スレッド↓があるのでそちらへ。
C言語なら俺に聞け(入門篇) Part 49
http://pc12.2ch.net/test/read.cgi/tech/1244297476/
【初心者歓迎】C/C++室 Ver.66【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1243440528/
C/C++の宿題片付けます 128代目
http://pc12.2ch.net/test/read.cgi/tech/1245853701/
【書き込む前に】
・まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
・質問する前には最低限検索を。
・エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
【参考文献】
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244
【このスレのログ】
前スレ:http://pc12.2ch.net/test/read.cgi/tech/1201153965/
他の過去ログ:http://nssearch.hp.infoseek.co.jp/clang/
【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。

2 :09/06/28
>>1

3 :09/06/28
いちょつ

4 :09/06/30
「構造体オブジェクトへのポインタは、適切に変換すれば、その先頭メンバを指す。
更に、逆も成り立つ。」
とありますが void* へのキャストを経由して変換しても問題ありませんか?
「与えられた境界調整をもつオブジェクトへのポインタは、同じか、より制限の弱い
境界調整を持つオブジェクトへのポインタに型変換して、再び元に戻してもよいこと
を保証する。その結果は、元のポインタと比較して等しくなければならない。」
これは最初の型と戻した型が同じ場合ですよね。

5 :09/06/30
>>1

6 :09/07/01
>>4
1. yes.
2. yes.

7 :09/07/14
**argvって変更してもいいの?

8 :09/07/14
だめ

9 :09/07/14
たしか、絶対駄目ではないが、
それなりに自己責任。

10 :09/07/14
ダメならconst修飾させられるだろうな

11 :09/07/14
>>10
過去との互換性でconstをつけられなかったのかもしれない。
いずれにしても、環境依存だと思われ。

12 :09/07/19
お前ら嘘言うなよ
argvは変更していい
ちゃんと規格で保証されてる

13 :09/07/19
だいたい「駄目じゃないけどそれなりに自己責任」とか
「・・・だろうな」とか適当なこと言ってて恥ずかしくないのか
初心者はスレタイ嫁

14 :09/07/19
レスポンスする人は、どの規格書のどのセクションに書いてあるかを示してから、レスポンスする。 (次からテンプレ)
Rationale for American National Standard for Information Systems Programming Language C
2.1.2.2 Hosted environment
には特に書かれていなかった。よって、C89では、変更してはならない。
# 探し漏れてしまったのかもしれないが。
ISO/IEC 9899:1999 (E)
5.1.2.2.1 Program startup
2 - The parameters argc and argv and the strings pointed to by the argv array shall
be modifiable by the program, and retain their last-stored values between program
startup and program termination.
とあり、C99では変更してもよいことになっている。
ISO/IEC 9899:201x Committee Draft - August 11, 2008 WG14/N1336
でも同様のセクションに同様のことが書かれている。

15 :09/07/19
C89の仕様書って、今手に入れるにはどうしたら?

16 :09/07/19
ANSIやISOは知らないけど、JISだと改訂された規格は
そもそもなかったことになるので、公式なところからはもう手に入らない。
古書マーケットに流れてるのを捕まえるとかしかないと思う。
まあ見るだけならそれなりの図書館行けば収蔵されてるだろうけど。

17 :09/07/19
>>14
そりゃ Rationale には書いてないだろう
規格書の方には Progarm startup の節に同じことが書いてある
ので C89 でも書き換えていい

18 :09/07/19
>>17 確かにおっしゃる通り。ANSI Cには
2.1.2.2 Hosted environment
Program startup
に全く同じことが書かれていた。
ということで、C90でもC99でもC1xでも変更しても良いことになっている。

19 :09/07/19
単なる仮引数なのだから、禁止する規則がない限り
書き換えてよいと解釈するべきだろう。

20 :09/07/20
スタートアップがROM化されてる
可能性があるのだから、書き換えは
自己責任だろ。

21 :09/07/20
ホスト環境とフリースタンディング環境の区別が付くようになってから書き込んでください

22 :09/07/20
そういや、ユーザ定義関数の仮引数に代入してもいいってのは
どこに書いてあるんだっけ?

23 :09/07/21
>>21
区別はわかってるつもりですが、
問題がありますか?
>>19
ちなみに>>7は、仮引数自体じゃなくて、
それがさす先(**argv)の変更を聞いて
いるようですが。

24 :09/07/21
> 2 - The parameters argc and argv and the strings pointed to by the argv array shall
> be modifiable by the program, and retain their last-stored values between program
> startup and program termination.
なんでargcとargvはmodifiableでなければならないとあえて明示してるのか?
「他で制限されてない限り、仮引数はmodifiableである」というのが正しければ、
"the strings pointed to by the argv array"についてのみ言明すればよかったはず。

25 :09/07/21
> 「他で制限されてない限り、仮引数はmodifiableである」というのが正しければ、
そうは書いてないの?

26 :09/07/21
>>25
>22が上で聞いているが、そういう記述はない。
>19の解釈を採用すれば問題ないが。

27 :09/07/22
関数の引数はローカル変数扱いだろうが。

28 :09/07/22
>>27
規格へのポインタがヌルだよ

29 :09/07/22
>>24
main関数はいろいろ特別だから、
明記する必要があるのでは。
たしか、ユーザーが呼び出すのも
厳密にはダメだよね。

30 :09/07/23
Cではmain再帰は特に禁止されてない。C++では駄目だけど。

31 :09/07/23
だからそれがどこに書かれているのか示してくれと何度言えばわかるんだ

32 :09/07/23
特に禁止されてない。つまり何も書いてない。

33 :09/07/23
C++での話だ

34 :09/07/23
ここはCの規格スレ

35 :09/07/23
だったら言うなってんだ

36 :09/07/23
スレ違いの話題は他所でやってください

37 :09/07/23
スレ違い

38 :09/07/23
>>30 Cでは禁止されていないが、C++では禁止
>>31 C++で禁止されていることはどこに書かれている?
>>32 Cでは禁止されてない
>>33 いやいや、C++の方
>>34 ここCスレだからそれはどうでもいい
>>35 ???<ここが分からん

39 :09/07/23
>>38
34と35は投稿時刻が近いから、35は34を見ず、33に対してC++の話はすんな、と言っているのではないだろうか。

40 :09/07/23
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

41 :09/07/23
ビットをシフトするのに役立つ

42 :09/07/24
>>40
そのコピペを作るのに役に立った

43 :09/07/24
>>1

44 :09/08/12
あげ

45 :09/08/22
c99の書式で解説しているcの入門書はありまつか

46 :09/08/22
入門レベルでC89とC99で違うようなところってあるかな?

47 :09/08/22
boolean型
宣言時の暗黙の型の禁止
変数宣言の位置
などは最初から覚えたほうがいい希ガス

48 :09/08/27
C89とClean Cはどこが違うの?

49 :09/08/27
Clean Cって?

50 :09/08/27
http://www.amazon.co.jp/gp/product/product-description/4434124234/ref=dp_proddesc_0?ie=UTF8&n=465392&s=books
Clean C----規格Cと規格C++の部分集合----

51 :09/10/06
T **からvoid **へのキャストは規格上できるんだっけ(Tはvoid以外)

52 :09/10/06
いいえ
void*だけ

53 :09/10/06
ありがとうございます
つまり、T **からvoid *へのキャストはできる(その後、T **にキャストしなおすことも)
なぜvoid *があるのにvoid **にキャストしようとしたのか理解に苦しむ人がいた
っていうか僕だった

54 :09/10/06
まあvoid *型というのはvoid型と違って具体的に存在する型なので、
void *を指すポインタの型としてvoid **型は使うからね。

55 :09/10/13
void * を指すポインタの型は void * ではないでしょうか。

56 :09/10/13
>>55
普通に考えてvoid**だろうが。もちろんvoid*に暗黙的に変換することは可能だが

57 :09/10/13
はたしてそうだろうか

58 :09/10/14
ということにしたいのですね。
 ヘ_ヘ
ミ ・ ・ ミ
 ( ° )〜

59 :09/10/14
いいえ事実です.

60 :09/10/19
struct foo_t f = {};
これでfの各メンバが初期化される保証はありますか?

61 :09/10/19
>>60
空のイニシャライザは認められない。
{0} などと最低一つは中身を書く必要がある。

62 :09/10/19
>>61
どうも。
{}でコンパイルできちゃったけどこれはGCCの拡張なのね

63 :09/10/27
infとnanについて聞きたいんですけど
infでない正の実数xに対して
x <= inf 常に真
-inf <= -x 常に真
すべてのinf,nanを含む実数yに対して
y < nan, y <= nan , nan < y, nan <= y nan == y 常に偽
nan != y 常に真
これらは処理系によらず正しいでしょうか?

64 :09/10/28
infやnanなんてものの存在自体が処理系依存なので・・・

65 :09/10/28
んなことはない。IEEE754読め

66 :09/10/28
浮動小数にIEEE754が使われているかどうかが処理系依存
わかるかね

67 :09/10/28
> 処理系依存
用語がスレ違い

68 :09/10/29
はい?

69 :09/11/27
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

70 :09/11/27
何度目だナウシカ
そのコピペを作るのに役に立ちます
と合いの手で答えてあげるべきか

71 :09/11/27
ビットシフトはなんね役に立つのでしょうか?

72 :09/11/27
C言語をはじめたばかりであまりわからないのですが、
void 型ってなんの役に立つのでしょうか?
例えばint型にしておけばいいと思うのですが。

73 :09/11/27
int型にして戻り値は何を返すの?

74 :09/11/28
>>73
はい。return 0;でも、return 1;でも、適当に何か返して
おけばいいような気がするのですが。
呼び出し元は戻り値を無視すればいいわけですし。
だから、void型なんていらないと思うのです。

75 :09/11/28
俺はautoが何の役に立つのか分からん。昔は明示しなければならなかったの?

76 :09/11/28
うん。パーサの簡略化のためにストレージクラスが必要な時代もあった

77 :09/11/28
>>72
戻り値を使わないことをコンパイラに教えると
値を返す部分のコードをコンパイラが書かないので
まあそう言われると今時たいしてうれしくはないな

78 :09/11/28
>>74
voidでない関数の返す値を無視する場合
(void)printf("foo");
のように明示的にキャストしないと、注意してくるLintがあったりするので、
voidならvoidのほうが良い。

79 :09/11/28
>>74
役に立つとかの視点じゃなくて
戻り値を戻さないことで、関数内で処理が完結してることを明示してる
変に無意味な戻り値を返すと、使用側が混乱するかもねー
てか、このスレじゃなくて初心者スレで聞いたほうがいいよー

80 :09/11/28
お前ら、なんでマジレスしてんだ?
スルーしろよ。

81 :09/11/28
つまんね

82 :09/11/28
>>75-76
つーかB言語のなごりだな

83 :09/11/28
>>72
void * はある程度のレベルになると便利に使えます。キャストを多用するため型チェックがきかなくなるのが欠点ですが。
たとえば、http://codepad.org/qS3Gh6kJ
(宿題スレの産物です。)

84 :09/11/28
それは void * だし
質問してるのは  void だし

85 :09/11/28
void f( void ); と int f( int );
だと、前者を呼ぶにはf();とすればいいけど、
後者を呼ぶにはf(n)としなくちゃいけないじゃないか。
タイプ量が増えて疲れる。

86 :09/11/29
リエントラントとしてはvoidの方がいい

87 :09/11/29
>>76
そんな時代があったことはない。

88 :09/11/30
C言語をはじめたばかりであまりわからないのですが、
マウスから酢昆布のような臭いがするんですけど
どうしたらいいですか?

89 :09/11/30
あなたにふさわしいマウスです

90 :09/11/30
初心者は来るな

91 :09/12/23
C言語をはじめたばかりであまりわからないのですが、
手袋にマウスの酢昆布のような臭いが移ったんですけど
どうしたらいいですか?

92 :09/12/23
初心者お断り
スレタイくらい読まないか

93 :09/12/23
僕もみなさんのようにC言語で自称プログラマーごっこしたいのですが、まず何をすればですか?

94 :09/12/23
まずUNIXをハックします

95 :09/12/29
C言語をはじめたばかりであまりわからないのですが、
雪も降ってるのに部屋に暖房が無くて寒いんですけど
どうしたらいいですか?

96 :09/12/29
CPUをフルパワーで回し続ければ廃熱で温まるYO!

97 :09/12/29
int main()
{
}

98 :09/12/29
>>96
これを実行するわけだな
int main()
{
while( 1 );
return 0;
}

99 :09/12/29
やたー暖房プログラムできたよー
int main()
{
   while(1);
}

100 :09/12/29
ネタ被りサーセン

101 :09/12/29
でも最近のマシン速いから無限ループくらいものの数秒で終了するんだろ?

102 :09/12/29
終了しないプログラムでも
ソースコードでは戻り値は返さないといけない

103 :09/12/30
CPUの消費電力上げるなら、キャッシュとかパイプラインとか
浮動小数点レジスタとか、CPUを出来るだけ全面使った方がいいかも

104 :09/12/30
>>102
main()はreturnを省略するとreturn 0;と同値になる。

105 :10/01/26
関数へのポインタをprintf系関数で表示させる方法って無いんだな。%pってvoid*だから関数ポインタと互換無いし。

106 :10/01/26
intptr_t への変換すら明言されてないんだっけ?

107 :10/01/26
>>105
普通に void * にキャストすれば?
#include <stdio.h>
int func() { return 0; };
int main() {
void *p = (void *)func;
printf("%p\n", p);
return 0;
}

108 :10/01/26
このスレでその発言は痛いな

109 :10/01/27
107が「普通に void * にキャスト」できる根拠を示せれば問題ないよ!

110 :10/01/30
規格準拠専用スレなのに、ほとんどのやつが規格を持ってさえいない…

111 :10/01/30
規格票は持っているが規格は持っていない

112 :10/02/02
規格書を引用しない奴は出ていけ

113 :10/02/02
どの版持ってればいい?

114 :10/02/17
C言語をはじめたばかりであまりわからないのですが、
尿をすると時折尿道がズキズキとひどく痛む事があるんですけど
何かの病気でしょうか?

115 :10/02/17
P

116 :10/02/17
free(penis);
が抜けてるんじゃないかな

117 :10/02/19
以下のような構造体へのポインタのキャストは許されているかどうか
typedef struct {
  foo_t foo;
  bar_t bar;
} hoge_t;
typedef struct {
  hoge_t hoge;
  baz_t baz;
} fuga_t;
hoge_t *
hoge_t_foo(baz_t baz)
{
  fuga_t *fuga;
  fuga = malloc(sizeof(fuga_t));
  fuga->baz = baz;
  return (hoge_t *)fuga;
}
baz_t
hoge_t_bar(hoge_t *hoge)
{
  fuga_t *fuga = (fuga_t *)hoge;
  return fuga->baz;
}

118 :10/02/19
>>117
構造体先頭にはパディングが入らないことが保証されているので、 hoge_t_foo() でのキャストは安全。
6.7.2.1 Structure and union specifiers p13
> There may be unnamed padding within a structure object, but not at its beginning.
hoge_t_bar() でのキャストは、 hoge が実際に fuga の先頭要素である場合に限って安全。

119 :10/02/19
>118
素早い回答ありがとうございました

120 :10/02/19
「安全」をどういう意味で使っているのか知らないが、
言語規格ではポインタ型のキャストは特定の場合を除いて処理系定義動作。
したがって、
> 以下のような構造体へのポインタのキャストは許されているかどうか
に対する答は「処理系による」

121 :10/02/19
>>119-120
ごめん、引用箇所と理由付けがおかしかった。
同じく 6.7.2.1 Structure and union specifiers p13 より。
> A pointer to a structure object, suitably converted, points to its initial member
> (or if that member is a bit-field, then to the unit in which it resides), and vice versa.
この直後に >118 の引用文が続くんだけど、キャストが安全かどうかとは関係ないね。

122 :10/03/27
C言語をはじめたばかりであまりわからないのですが、
フルートの最低音の C が鳴らせません。
どうしたらいいでしょうか?

123 :10/03/27
がんばれ

124 :10/04/12
C言語をはじめたばかりであまりわからないのですが、
人生が終わりそうです。
どうしたらいいでしょうか?

125 :10/04/12
ビットシフトってなんの役に立つの?

126 :10/04/12
goto 人生のスタートライン
>>125
そのコピペを作るのに役に立ってる

127 :10/04/29
すいませんが教えてほしいことがあります
いま学校の課題で、1+2+3・・・というように加算していき、
加算結果が300を超えたら表示し、処理を終了するプログラムを
作りたいのですが、わかる方いましたら、教えてください。
ちなみにdo-whileで作るのが条件です。
お願いします。

128 :10/04/29
>>127
>>1をよく読め
http://pc12.2ch.net/test/read.cgi/tech/1270909823/
こっちでやれ

129 :10/05/31
C言語をはじめたばかりであまりわからないのですが、
トイレに行きたいです。
どうしたらいいでしょうか?

130 :10/05/31
しばらく我慢するしかないと思う

131 :10/05/31
ありがとうございました、我慢します。

132 :10/05/31
そろそろ漏れそうなのですが。

133 :10/05/31
core dumpとうまく付き合っていかないとダメだからなぁ。
どこまで我慢すべきかもそのうち分かってくると思う。

134 :10/06/24
C言語をはじめたばかりであまりわからないのですが、
飼い猫に「お前は何で猫なんだ」と問いかけても反応が無いのですが
どうしたらいいでしょうか?
あと、猫がなぜあれほど愛玩欲をかきたてられる存在なのかも教えてください。

135 :10/06/24
>>134
規格に明記されていないことは未定義動作。
猫の反応についての規定はないので、当然処理系ごとに反応は異なる。

136 :10/06/24
規格に未定義と明記してあるのが未定義動作

137 :10/06/24
必ず明記されるのは処理系定義と文化圏固有と未規定
未定義は言外に示されることがある

138 :10/06/24
未定義という言葉の意味からも分かるよね
未定義と明記してあるものも、
何も触れられていないものも、
どちらも未定義

139 :10/07/13
C言語をはじめたばかりであまりわからないのですが、
飼い猫が汲み置きの水には見向きもせず、水道の蛇口からの流水しか飲みません。
水道代がもったいないのですが、どうしたらいいですか?

140 :10/07/13
もったいないから空気吸うな

141 :10/07/13
すわせてください
しんでしまいます

142 :10/07/13
C言語をはじめたばかりであまりわからないのですが、
             / ̄\
            │34nm |
             \_/    インテル!
             _|_|_
       n:     /      \    n: 
       ||   /         ヽ    ||   
      f「| |^ト  |   :::\::/:::   |  「| |^|`|  エーーックス
      |: ::  ! }  | <(゚)>::::<(゚)> |  | !  : ::}   ニジュウゴ
      ヽ  ,イ  ヽ  (__人__) /  ヽ  ,イ     エーーーッムッッ!
            \ `⌒´ /

143 :10/07/23
C言語をはじめたばかりであまりわからないのですが、
変数を2乗するのに
i *= i;
って規格的にOKですか?

144 :10/07/23
うん

145 :10/08/28
JISX3010:2003 の 6.3.2.3 にある文
> オブジェクト型又は不完全型へのポインタは、
> 他のオブジェクト型又は不完全型へのポインタに型変換できる。
> その結果のポインタが、被参照型に関して正しく境界調整されていなければ、
> その動作は未定義とする。
> そうでない場合、再び型変換で元の型に戻すならば、
> その結果は元のポインタと比較して等しくなければならない。
についてです。
境界調整されていなければ未定義っていうことは、
境界調整されていれば未定義ではないということでしょうか?
未定義ではないということはどこかに定義があるのでしょうか?
っていうか境界調整って何よ?
私には定義が見付けられませんでした。

146 :10/08/28
>>145
どうでもいい話ですが、
>境界調整されていなければ未定義っていうこと‥‥@
の対偶は
定義されておれば、それは境界調整されている。
です。
@が成立するからといって、その裏命題の
> 境界調整されていれば未定義ではない
が論理的に導かれるわけではないことに、注意しなければなりません。

147 :10/08/28
>>145
3.2 は見た?

148 :10/08/28
例えば、先頭に int のメンバを含む2種類の構造体 A, B があったとして、
A* を B* に変換して先頭のメンバにアクセスした結果は変換前と同じかどうか確認したかったのです。
6.2.5 の「構造体型へのポインタは、すべて同じ表現及び同じ境界調整要求をもたなければならない。」
と合わせて考えると、この場合は期待通りになると解釈できそうですね。

149 :10/08/28
共用体を知らないだけ?

150 :10/08/28
共用体は知ってます。
規格内かどうかにかかわらず自分が書くコードでポインタのキャストはしませんが、
初心者の知人がブログで書いてたコードでポインタのキャストをしてたので、
それが規格内なのかどうか確認したかったんです。
規格内だとするとそれがよくないスタイルだと説明する根拠がひとつ減っちゃうな。

151 :10/08/28
>145
ISO/IEC 9899:1999 (E)
6.3.2.3 Pointers
7 A pointer to an object or incomplete type may be converted to a pointer to a different
object or incomplete type. If the resulting pointer is not correctly aligned57) for the
pointed-to type, the behavior is undefined. Otherwise, when converted back again, the
result shall compare equal to the original pointer. When a pointer to an object is
converted to a pointer to a character type, the result points to the lowest addressed byte of
the object. Successive increments of the result, up to the size of the object, yield pointers
to the remaining bytes of the object.
57) In general, the concept ‘‘correctly aligned’’ is transitive: if a pointer to type A is correctly aligned for a
pointer to type B, which in turn is correctly aligned for a pointer to type C, then a pointer to type A is
correctly aligned for a pointer to type C.
>148
6.7.2.1 Structure and union specifiers
13 Within a structure object, the non-bit-field members and the units in which bit-fields
reside have addresses that increase in the order in which they are declared. A pointer to a
structure object, suitably converted, points to its initial member (or if that member is a
bit-field, then to the unit in which it resides), and vice versa. There may be unnamed
padding within a structure object, but not at its beginning.
>4,6,121
以下、想定したコード
>152, 153
>150
実際のコードがどのようなものかわからないとなんとも
そのブログなりコード片なり頼む

152 :10/08/28
>>150
キャストについては問題ないんだけど、その後のアクセスについてはさらに 6.5 p7 で
許されているものに限らないといけない。これについても >148 にある先頭の int への
アクセスに限れば 6.7.2.1 p13 にあるルールにより、問題は無い。

153 :10/08/28
foo.h
#include <stddef.h>
typedef struct foo foo_t;
typedef struct bar bar_t;
foo_t *alloc_foo_t(void);
bar_t *alloc_bar_t(void);
void set_foo_t(foo_t *f, int a, int b, char *c);
void set_bar_t(bar_t *b, int d, int e);
size_t foo_t_size(void);
size_t bar_t_size(void);
foo.c
#include "foo.h"
#include <stdlib.h>
struct foo { int a; int b; char *c; };
struct bar { int d; int e; };
foo_t *alloc_foo_t(void) { return malloc(foo_t_size()); }
bar_t *alloc_bar_t(void) { return malloc(bar_t_size()); }
void set_foo_t(foo_t *f, int a, int b, char *c) { f->a = a; f->b = b; f->c = c; }
void set_bar_t(bar_t *b, int d, int e) { b->d = d; b->e = e; }
size_t foo_t_size(void) { return sizeof(struct foo); }
size_t bar_t_size(void) { return sizeof(struct bar); }

154 :10/08/28
bar.c
#include "foo.h"
void bar(void) {
foo_t *f; /* 不完全型 */
bar_t *b; /* 不完全型 */
struct piyo {
int a;
} *p; /* 完全型 */
unsigned char *u; /* unsigned char *として扱う */
size_t i;
f = alloc_foo_t();
set_foo_t(f, 10, 100, NULL);
b = (bar_t *)f; /* 不完全型から不完全型への変換 */
set_bar_t(b, 20, 200);
p = (struct piyo *)b; /* 不完全型から完全型への変換 */
(void)p->a; p->a = 30; /* メンバの先頭へのポインタは一致する */
u = (unsigned char *)b; /* 不完全型からオブジェクト型への変換 */
for ( i = 0; i < bar_t_size(); ++i ) {
(void)*u++;
}
}

155 :10/08/28
割り込んでスマンカッタ

156 :10/08/28
いや、さすがに無いレスを参照するような書き方が悪かった
なるんじゃないかとは思っていたが、本当になるとは
まぁまぁ、規格について話せれば、その他の細かいことは気にしない
>151, 153, 154
規格からこのようなコードなら大丈夫なのではないかと考えられたので、試しに書いただけです
自信無いです、ツッコミ歓迎です

157 :10/08/28
void にキャストする意図は?

158 :10/08/28
>>153-154
set_bar_t(b, 20, 200) の中の b->e で、直前に struct foo の b (あるいはパディング)として
使っていた領域に無理やり struct bar の e としてアクセスしてるのがダメっぽい。

159 :10/08/28
>157
lintとかコンパイラの警告高くするとうるさいから
参照するけど使いませんよと示す意図
>158
たしかに、struct fooのaとbの間にパディングが無いという保証はされていない
入る可能性があるとは書かれているが、こういう場合には入らないというのを一応探してみる
ちなみに、6.2.6.1にパディングに値を入れるのはunspecified behavior(未規定動作)として書かれている
未規定だから期待どおりに動かなくても文句はいえないし、その環境でたまたまうまくいっただけだからダメだね
では、correctly aligned(境界調整)っていうのは、
struct bar_ {
int d; int e; char *f;
};
こういうことなのか

160 :10/08/28
>>159
> lintとか
では規格に違反しないためではないんだな?

161 :10/09/18
void* a = NULL;
T* b = NULL;
T が任意のオブジェクト型のとき (uintptr_t)a == (uintptr_t)b の真偽は処理系に依存しますか?

162 :10/09/19
ポインタを整数にキャストした結果は処理系定義

163 :10/09/19
>>162
ありがとうございました。
NULL ポインタについては ttp://www.kouno.jp/home/c_faq/c5.html に詳しく書かれていて、
現実に型が違うとポインタのビット数や内部表現が違う処理系もあるみたいですね。
(uintptr_t)a == (uintptr_t)(void*)b とすると両辺が void* の NULL から uintptr_t
に変換されるから真になると考えていいでしょうか?

164 :10/09/21
>>163
スレ的には、キャストにそういう期待を
してはいけない、にしかならんだろ。
それでもぶっとおすのも自由。w

165 :10/11/01
参考
http://studiokingyo.fc2web.com/

166 :11/07/02
2011年になっても未だにJAVA使い続けてる奴ってさ
仕事で仕方なくならわかるけど
家でもJAVAやってるなら本当にバカだよね。哀れゴミだし

167 :11/07/05
2011年になっても未だにJAVA使い続けてる奴ってさ
仕事で仕方なくならわかるけど
家でもJAVAやってるなら本当にバカだよね。哀れ
ゴミの分際でw

168 :11/07/05
天使ちゃんマジ天使

169 :11/07/05
天使ちゃんマジスレ違い

170 :11/07/06


171 :11/07/06
誰に言ってるの?

172 :11/07/07
統合失調症って辛そうだな

173 :11/07/27
カ オ ス ラ ウ ン ジ ゆ る せ な ぁ い ー

174 :11/07/27
うぜぇぞふたば民。
こういう時ばかり2ちゃんねらー利用しようとするとかどんだけ。

175 :11/09/13
sizeof(T[N]) == (sizeof(T)*N) であることは規格で保証されていますか?
C++ だと sizeof の規定 5.3.3 p2 に "This implies that the size of an array of n elements is n times the size of an element." って
書いてあるんですが、 C の規格にそれっぽいのが見つかりません。 C++ のほうでも "This implies ..." とあるものの、このほかに
配列終端のパディングを禁止するような規定は見当たらない感じです。

176 :11/09/13
>>175
C でも C++ でもその 2 つは絶対にイコールにならない
http://codepad.org/AmTDVSo8

177 :11/09/13
>>176 えーとそれは質問を取り違えている。
質問における T は変数名じゃなくて、型名を意図している(ものと思われる)。
配列型の、仮引数ではない変数について sizeof foo / sizeof foo[0] のようにして、
配列の個数を求めること、が規格中に sizeof の用途として示されてるので、
多分そう仮定して大丈夫という気はするが...

178 :11/09/13
つまり、T foo[N]のときに sizeof(foo) = sizeof(T) * N かどうかということか?
それなら問題ない。

179 :11/09/13
>>176
すいません。 T は任意のオブジェクト型、というつもりでした。
>>177
n1570 で 6.5.3.4 の EXAMPLE 2 として確認しました。ありがとうございます。
とりあえず規格の意図や移植性については問題なさそうです。
他に本文での規定があればいいのですが、どうやらそういう記述は無いようで、
何度か同様の議論が起こっているようでした。
http://groups.google.com/group/comp.lang.c.moderated/browse_frm/thread/617c4605a0aaeb67
http://groups.google.com/group/comp.std.c/browse_frm/thread/5b20086d55ca4c47

180 :11/09/13
そしてスルーされる>178

181 :11/10/04
C99 では -3 / 2 == -1 と決まってたんだね。-2 の方がよかったのに…。
-3 >> 1 なら -2 になるみたいだけど、2^n 以外でも割りたいしなぁ。

182 :11/12/25
C11記念age

183 :11/12/28
無名structとunionは嬉しいな

184 :12/03/06
>>181
何これ?3 / 2 が 2 になるのは初めて聞いたんだけど
そういう事してる言語とか数学とかあんの?

185 :12/03/06
0方向への丸めの方が一般的だと思ってたけど
別に-∞への丸めでもいいんじゃないの?

186 :12/03/06
>>184
3 / 2 じゃなくて -3 / 2 の話だろ。
商が負のときにゼロ側に丸めるかマイナス無限側にまるめるかは言語によってどっちもあるよ。

187 :12/03/07
合同式を考えると、正の場合と同じく、-∞側にまるめてくれたほうがいいと思うのですが、抵抗を感じる人も多いようですね。
mod 3 で
4 ≡ 1 ≡ -2 ≡ -5
でも
-5 ÷ 3 = -2 ... 1 がいい?
それとも
-5 ÷ 3 = -1 ... -2 がいい?

188 :12/03/07
そういうのはFortranに任せとけ

189 :12/03/07
ちなみに Scheme では両方ある。 quotient と div 。
Haskell だと quot と div だな。

190 :12/03/07
正負の絶対値が異なる言語って辛くないのかなぁ

191 :12/03/08
どちらになるか、はっきりしていれば問題ない。
どっちがいいかは、はっきり言って慣れ。

192 :12/03/12
Cだとどうせ負の最大値の絶対値は表現できないから正負で丸める方向が違っても気にならんな。

193 :12/03/12
>>190
最低限保証しなければならない範囲は同じだが?

194 :12/03/12
正負の絶対値が異なるというのがどういうことか、みんなわかってるの?
俺はサッパリ理解できないんだけど

195 :12/03/15
文脈とか空気が読める人間なら解るんじゃないかな?

196 :12/03/15
規格には空気なんてないけどな

197 :12/03/15
スレにはあるね
あまりにも天然な問いには誰も答えない

198 :12/03/30
いつになったら引数なし関数の仮引数にvoidって書かなくてよくなるの?

199 :12/03/31
C99では関数の中身を記述する場合にはもう書かなくってもvoid と差はないはず、という主張をくりかえしてきたのだけれども、実際は差があるようで困惑中。
ISO/IEC 9899:1999 6.7.5.3.14
An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.

200 :12/03/31
ありがとう 書かなくてよくはならなさそうですね

201 :12/03/31
C++へようこそ。
TOP カテ一覧 スレ一覧 2ch元 削除依頼
【Java】DIコンテナって本当に便利か? (453)
IDにC、C++、VB、etc...が出たら神!!! (160)
Git 4 (242)
IDにC、C++、VB、etc...が出たら神!!! (160)
懐かしのMS-DOSプログラミング (333)
クラス名・変数名に迷ったら書き込むスレ。Part21 (416)
--log9.info------------------
【84回】甲子園へ行こう!【選抜】 (410)
箕面東を密かに期待するスレ 2 (137)
○兵庫県立加古川北高等学校応援スレ5○ (852)
本庄第一、埼玉栄、昌平を語るスレ (159)
上宮高校 vs 上宮太子高校 (374)
川之江高校また不祥事だって (528)
【引き続き】桐蔭学園Part18【監督議論】 (619)
スレ立て代行依頼スレ@高校野球板5 (813)
野球部のやつにしかわからない事 4 (654)
【全国1マンモス高校】作新学院2【怪物王者】 (584)
鹿児島の高校野球を語るスレPart64 (375)
▲▲▲Bull Fighters 上田西わっしょい野球3▲▲▲ (948)
【優勝候補?】明徳義塾Part26【それが落とし穴】 (198)
千葉経済大学付属高校23 (905)
★☆★ 茨城の高校野球 146 ★☆★ (170)
◆◆◆聖望学園◆◆◆ (843)
--log55.com------------------
★【実家片付け】コンチェルトみほ20【サロネーゼ】
世界の王室雑談スレPart87
主婦だって漫画好き!〜190冊目〜
★おぎゃあ!羽生結弦が覚せい剤タイーホオカマ野郎乙
【山口敬之】【伊藤詩織】裁判考察スレ Part12
【昭和・平成】昔の少女漫画を語る【レトロ】86冊目
大津で保育園児ら16人を死傷させた新立文子(53)
更年期障害に悩む奥様100