【初心者お断り】ガチ規格準拠C専用スレ Part134
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/06/28(日) 00:18:42C言語初心者の初歩的な質問、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/
【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。
0002デフォルトの名無しさん
2009/06/28(日) 01:07:440003デフォルトの名無しさん
2009/06/28(日) 13:04:190004デフォルトの名無しさん
2009/06/30(火) 19:12:41更に、逆も成り立つ。」
とありますが void* へのキャストを経由して変換しても問題ありませんか?
「与えられた境界調整をもつオブジェクトへのポインタは、同じか、より制限の弱い
境界調整を持つオブジェクトへのポインタに型変換して、再び元に戻してもよいこと
を保証する。その結果は、元のポインタと比較して等しくなければならない。」
これは最初の型と戻した型が同じ場合ですよね。
0005デフォルトの名無しさん
2009/06/30(火) 22:39:420006デフォルトの名無しさん
2009/07/01(水) 01:44:421. yes.
2. yes.
0007デフォルトの名無しさん
2009/07/14(火) 07:10:130008デフォルトの名無しさん
2009/07/14(火) 09:55:240009デフォルトの名無しさん
2009/07/14(火) 12:38:59それなりに自己責任。
0010デフォルトの名無しさん
2009/07/14(火) 23:06:360011デフォルトの名無しさん
2009/07/14(火) 23:57:08過去との互換性でconstをつけられなかったのかもしれない。
いずれにしても、環境依存だと思われ。
0012デフォルトの名無しさん
2009/07/19(日) 05:49:28argvは変更していい
ちゃんと規格で保証されてる
0013デフォルトの名無しさん
2009/07/19(日) 05:54:37「・・・だろうな」とか適当なこと言ってて恥ずかしくないのか
初心者はスレタイ嫁
0014デフォルトの名無しさん
2009/07/19(日) 09:52:32Rationale 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
でも同様のセクションに同様のことが書かれている。
0015デフォルトの名無しさん
2009/07/19(日) 11:34:450016デフォルトの名無しさん
2009/07/19(日) 12:33:10そもそもなかったことになるので、公式なところからはもう手に入らない。
古書マーケットに流れてるのを捕まえるとかしかないと思う。
まあ見るだけならそれなりの図書館行けば収蔵されてるだろうけど。
0017デフォルトの名無しさん
2009/07/19(日) 14:52:19そりゃ Rationale には書いてないだろう
規格書の方には Progarm startup の節に同じことが書いてある
ので C89 でも書き換えていい
0018デフォルトの名無しさん
2009/07/19(日) 15:12:232.1.2.2 Hosted environment
Program startup
に全く同じことが書かれていた。
ということで、C90でもC99でもC1xでも変更しても良いことになっている。
0019デフォルトの名無しさん
2009/07/19(日) 18:45:19書き換えてよいと解釈するべきだろう。
0020デフォルトの名無しさん
2009/07/20(月) 13:02:26可能性があるのだから、書き換えは
自己責任だろ。
0021デフォルトの名無しさん
2009/07/20(月) 15:14:250022デフォルトの名無しさん
2009/07/20(月) 21:18:18どこに書いてあるんだっけ?
002320
2009/07/21(火) 12:44:15区別はわかってるつもりですが、
問題がありますか?
>>19
ちなみに>>7は、仮引数自体じゃなくて、
それがさす先(**argv)の変更を聞いて
いるようですが。
0024デフォルトの名無しさん
2009/07/21(火) 18:09:03> 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"についてのみ言明すればよかったはず。
0025デフォルトの名無しさん
2009/07/21(火) 18:34:17そうは書いてないの?
0026デフォルトの名無しさん
2009/07/21(火) 20:52:12>22が上で聞いているが、そういう記述はない。
>19の解釈を採用すれば問題ないが。
0027デフォルトの名無しさん
2009/07/22(水) 18:13:100028デフォルトの名無しさん
2009/07/22(水) 18:38:01規格へのポインタがヌルだよ
0029デフォルトの名無しさん
2009/07/22(水) 18:45:40main関数はいろいろ特別だから、
明記する必要があるのでは。
たしか、ユーザーが呼び出すのも
厳密にはダメだよね。
0030デフォルトの名無しさん
2009/07/23(木) 02:22:520031デフォルトの名無しさん
2009/07/23(木) 02:24:130032デフォルトの名無しさん
2009/07/23(木) 02:40:200033デフォルトの名無しさん
2009/07/23(木) 03:59:500034デフォルトの名無しさん
2009/07/23(木) 04:04:140035デフォルトの名無しさん
2009/07/23(木) 04:10:410036デフォルトの名無しさん
2009/07/23(木) 04:26:170037デフォルトの名無しさん
2009/07/23(木) 04:31:520038デフォルトの名無しさん
2009/07/23(木) 04:41:48>>31 C++で禁止されていることはどこに書かれている?
>>32 Cでは禁止されてない
>>33 いやいや、C++の方
>>34 ここCスレだからそれはどうでもいい
>>35 ???<ここが分からん
0039デフォルトの名無しさん
2009/07/23(木) 22:01:3234と35は投稿時刻が近いから、35は34を見ず、33に対してC++の話はすんな、と言っているのではないだろうか。
0040デフォルトの名無しさん
2009/07/23(木) 23:31:41ビットシフトはなんの役に立つのでしょうか?
0041デフォルトの名無しさん
2009/07/23(木) 23:56:060042デフォルトの名無しさん
2009/07/24(金) 00:20:43そのコピペを作るのに役に立った
0043デフォルトの名無しさん
2009/07/24(金) 00:55:360044デフォルトの名無しさん
2009/08/12(水) 21:19:390045デフォルトの名無しさん
2009/08/22(土) 18:15:460046デフォルトの名無しさん
2009/08/22(土) 18:34:490047デフォルトの名無しさん
2009/08/22(土) 20:59:56宣言時の暗黙の型の禁止
変数宣言の位置
などは最初から覚えたほうがいい希ガス
0048デフォルトの名無しさん
2009/08/27(木) 02:38:160049デフォルトの名無しさん
2009/08/27(木) 10:55:170050デフォルトの名無しさん
2009/08/27(木) 22:36:49Clean C----規格Cと規格C++の部分集合----
0051デフォルトの名無しさん
2009/10/06(火) 09:12:060052デフォルトの名無しさん
2009/10/06(火) 10:24:47void*だけ
0053デフォルトの名無しさん
2009/10/06(火) 12:21:21つまり、T **からvoid *へのキャストはできる(その後、T **にキャストしなおすことも)
なぜvoid *があるのにvoid **にキャストしようとしたのか理解に苦しむ人がいた
っていうか僕だった
0054デフォルトの名無しさん
2009/10/06(火) 12:28:25void *を指すポインタの型としてvoid **型は使うからね。
0055デフォルトの名無しさん
2009/10/13(火) 22:00:160056デフォルトの名無しさん
2009/10/13(火) 22:10:39普通に考えてvoid**だろうが。もちろんvoid*に暗黙的に変換することは可能だが
0057デフォルトの名無しさん
2009/10/13(火) 22:22:180058デフォルトの名無しさん
2009/10/14(水) 08:34:07ヘ_ヘ
ミ ・ ・ ミ
( ° )〜
0059デフォルトの名無しさん
2009/10/14(水) 09:20:290060デフォルトの名無しさん
2009/10/19(月) 11:21:38これでfの各メンバが初期化される保証はありますか?
0061デフォルトの名無しさん
2009/10/19(月) 11:27:55空のイニシャライザは認められない。
{0} などと最低一つは中身を書く必要がある。
0062デフォルトの名無しさん
2009/10/19(月) 11:31:36どうも。
{}でコンパイルできちゃったけどこれはGCCの拡張なのね
0063デフォルトの名無しさん
2009/10/27(火) 21:30:44infでない正の実数xに対して
x <= inf 常に真
-inf <= -x 常に真
すべてのinf,nanを含む実数yに対して
y < nan, y <= nan , nan < y, nan <= y nan == y 常に偽
nan != y 常に真
これらは処理系によらず正しいでしょうか?
0064デフォルトの名無しさん
2009/10/28(水) 10:30:000065デフォルトの名無しさん
2009/10/28(水) 11:14:550066デフォルトの名無しさん
2009/10/28(水) 11:21:15わかるかね
0067デフォルトの名無しさん
2009/10/28(水) 23:02:24用語がスレ違い
0068デフォルトの名無しさん
2009/10/29(木) 14:22:470069デフォルトの名無しさん
2009/11/27(金) 21:57:14ビットシフトはなんの役に立つのでしょうか?
0070デフォルトの名無しさん
2009/11/27(金) 22:25:58そのコピペを作るのに役に立ちます
と合いの手で答えてあげるべきか
0071デフォルトの名無しさん
2009/11/27(金) 22:40:430072デフォルトの名無しさん
2009/11/27(金) 23:48:44void 型ってなんの役に立つのでしょうか?
例えばint型にしておけばいいと思うのですが。
0073デフォルトの名無しさん
2009/11/27(金) 23:52:360074デフォルトの名無しさん
2009/11/28(土) 00:17:43はい。return 0;でも、return 1;でも、適当に何か返して
おけばいいような気がするのですが。
呼び出し元は戻り値を無視すればいいわけですし。
だから、void型なんていらないと思うのです。
0075デフォルトの名無しさん
2009/11/28(土) 00:40:550076デフォルトの名無しさん
2009/11/28(土) 03:16:100077デフォルトの名無しさん
2009/11/28(土) 08:18:25戻り値を使わないことをコンパイラに教えると
値を返す部分のコードをコンパイラが書かないので
まあそう言われると今時たいしてうれしくはないな
0078デフォルトの名無しさん
2009/11/28(土) 09:13:14voidでない関数の返す値を無視する場合
(void)printf("foo");
のように明示的にキャストしないと、注意してくるLintがあったりするので、
voidならvoidのほうが良い。
0079デフォルトの名無しさん
2009/11/28(土) 10:29:21役に立つとかの視点じゃなくて
戻り値を戻さないことで、関数内で処理が完結してることを明示してる
変に無意味な戻り値を返すと、使用側が混乱するかもねー
てか、このスレじゃなくて初心者スレで聞いたほうがいいよー
008072
2009/11/28(土) 12:13:10スルーしろよ。
0081デフォルトの名無しさん
2009/11/28(土) 12:32:020082デフォルトの名無しさん
2009/11/28(土) 12:52:27つーかB言語のなごりだな
0083デフォルトの名無しさん
2009/11/28(土) 18:25:26void * はある程度のレベルになると便利に使えます。キャストを多用するため型チェックがきかなくなるのが欠点ですが。
たとえば、http://codepad.org/qS3Gh6kJ
(宿題スレの産物です。)
0084デフォルトの名無しさん
2009/11/28(土) 19:12:54質問してるのは void だし
0085デフォルトの名無しさん
2009/11/28(土) 22:08:02だと、前者を呼ぶにはf();とすればいいけど、
後者を呼ぶにはf(n)としなくちゃいけないじゃないか。
タイプ量が増えて疲れる。
0086デフォルトの名無しさん
2009/11/29(日) 00:19:270087デフォルトの名無しさん
2009/11/29(日) 19:43:13そんな時代があったことはない。
0088デフォルトの名無しさん
2009/11/30(月) 23:48:08マウスから酢昆布のような臭いがするんですけど
どうしたらいいですか?
0089デフォルトの名無しさん
2009/11/30(月) 23:53:240090デフォルトの名無しさん
2009/11/30(月) 23:55:280091デフォルトの名無しさん
2009/12/23(水) 06:22:56手袋にマウスの酢昆布のような臭いが移ったんですけど
どうしたらいいですか?
0092デフォルトの名無しさん
2009/12/23(水) 08:46:36スレタイくらい読まないか
0093デフォルトの名無しさん
2009/12/23(水) 12:56:060094デフォルトの名無しさん
2009/12/23(水) 13:06:100095デフォルトの名無しさん
2009/12/29(火) 17:06:33雪も降ってるのに部屋に暖房が無くて寒いんですけど
どうしたらいいですか?
0096デフォルトの名無しさん
2009/12/29(火) 17:21:000097デフォルトの名無しさん
2009/12/29(火) 21:40:11{
}
0098デフォルトの名無しさん
2009/12/29(火) 21:42:07これを実行するわけだな
int main()
{
while( 1 );
return 0;
}
0099デフォルトの名無しさん
2009/12/29(火) 21:45:28int main()
{
while(1);
}
010099
2009/12/29(火) 21:46:300101デフォルトの名無しさん
2009/12/29(火) 21:51:060102デフォルトの名無しさん
2009/12/29(火) 21:52:47ソースコードでは戻り値は返さないといけない
0103デフォルトの名無しさん
2009/12/30(水) 02:09:08浮動小数点レジスタとか、CPUを出来るだけ全面使った方がいいかも
0104デフォルトの名無しさん
2009/12/30(水) 13:03:47main()はreturnを省略するとreturn 0;と同値になる。
0105デフォルトの名無しさん
2010/01/26(火) 13:58:360106デフォルトの名無しさん
2010/01/26(火) 14:08:390107デフォルトの名無しさん
2010/01/26(火) 18:28:12普通に void * にキャストすれば?
#include <stdio.h>
int func() { return 0; };
int main() {
void *p = (void *)func;
printf("%p\n", p);
return 0;
}
0108デフォルトの名無しさん
2010/01/26(火) 22:27:310109デフォルトの名無しさん
2010/01/27(水) 09:46:300110デフォルトの名無しさん
2010/01/30(土) 07:38:270111デフォルトの名無しさん
2010/01/30(土) 15:56:160112デフォルトの名無しさん
2010/02/02(火) 03:45:460113デフォルトの名無しさん
2010/02/02(火) 19:54:270114デフォルトの名無しさん
2010/02/17(水) 20:49:43尿をすると時折尿道がズキズキとひどく痛む事があるんですけど
何かの病気でしょうか?
0115デフォルトの名無しさん
2010/02/17(水) 21:28:560116デフォルトの名無しさん
2010/02/17(水) 21:51:36が抜けてるんじゃないかな
0117デフォルトの名無しさん
2010/02/19(金) 02:36:42typedef 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;
}
0118デフォルトの名無しさん
2010/02/19(金) 02:46:43構造体先頭にはパディングが入らないことが保証されているので、 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 の先頭要素である場合に限って安全。
0119デフォルトの名無しさん
2010/02/19(金) 02:57:09素早い回答ありがとうございました
0120デフォルトの名無しさん
2010/02/19(金) 07:33:49言語規格ではポインタ型のキャストは特定の場合を除いて処理系定義動作。
したがって、
> 以下のような構造体へのポインタのキャストは許されているかどうか
に対する答は「処理系による」
0121118
2010/02/19(金) 08:52:24ごめん、引用箇所と理由付けがおかしかった。
同じく 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 の引用文が続くんだけど、キャストが安全かどうかとは関係ないね。
0122デフォルトの名無しさん
2010/03/27(土) 14:10:25フルートの最低音の C が鳴らせません。
どうしたらいいでしょうか?
0123デフォルトの名無しさん
2010/03/27(土) 17:24:450124デフォルトの名無しさん
2010/04/12(月) 17:03:59人生が終わりそうです。
どうしたらいいでしょうか?
0125デフォルトの名無しさん
2010/04/12(月) 17:10:310126デフォルトの名無しさん
2010/04/12(月) 17:17:56>>125
そのコピペを作るのに役に立ってる
0127ノラ
2010/04/29(木) 00:08:46いま学校の課題で、1+2+3・・・というように加算していき、
加算結果が300を超えたら表示し、処理を終了するプログラムを
作りたいのですが、わかる方いましたら、教えてください。
ちなみにdo-whileで作るのが条件です。
お願いします。
0128デフォルトの名無しさん
2010/04/29(木) 00:21:17>>1をよく読め
http://pc12.2ch.net/test/read.cgi/tech/1270909823/
こっちでやれ
0129デフォルトの名無しさん
2010/05/31(月) 18:23:10トイレに行きたいです。
どうしたらいいでしょうか?
0130デフォルトの名無しさん
2010/05/31(月) 18:35:030131デフォルトの名無しさん
2010/05/31(月) 18:43:150132デフォルトの名無しさん
2010/05/31(月) 20:22:330133デフォルトの名無しさん
2010/05/31(月) 22:05:51どこまで我慢すべきかもそのうち分かってくると思う。
0134デフォルトの名無しさん
2010/06/24(木) 00:11:27飼い猫に「お前は何で猫なんだ」と問いかけても反応が無いのですが
どうしたらいいでしょうか?
あと、猫がなぜあれほど愛玩欲をかきたてられる存在なのかも教えてください。
0135デフォルトの名無しさん
2010/06/24(木) 07:47:11規格に明記されていないことは未定義動作。
猫の反応についての規定はないので、当然処理系ごとに反応は異なる。
0136デフォルトの名無しさん
2010/06/24(木) 08:30:030137デフォルトの名無しさん
2010/06/24(木) 08:35:09未定義は言外に示されることがある
0138デフォルトの名無しさん
2010/06/24(木) 19:02:21未定義と明記してあるものも、
何も触れられていないものも、
どちらも未定義
0139デフォルトの名無しさん
2010/07/13(火) 14:55:14飼い猫が汲み置きの水には見向きもせず、水道の蛇口からの流水しか飲みません。
水道代がもったいないのですが、どうしたらいいですか?
0140デフォルトの名無しさん
2010/07/13(火) 18:15:430141デフォルトの名無しさん
2010/07/13(火) 22:21:17しんでしまいます
0142デフォルトの名無しさん
2010/07/13(火) 23:14:10/ ̄\
│34nm |
\_/ インテル!
_|_|_
n: / \ n:
|| / ヽ ||
f「| |^ト | :::\::/::: | 「| |^|`| エーーックス
|: :: ! } | <(゚)>::::<(゚)> | | ! : ::} ニジュウゴ
ヽ ,イ ヽ (__人__) / ヽ ,イ エーーーッムッッ!
\ `⌒´ /
0143デフォルトの名無しさん
2010/07/23(金) 13:42:07変数を2乗するのに
i *= i;
って規格的にOKですか?
0144デフォルトの名無しさん
2010/07/23(金) 13:48:120145デフォルトの名無しさん
2010/08/28(土) 10:00:57> オブジェクト型又は不完全型へのポインタは、
> 他のオブジェクト型又は不完全型へのポインタに型変換できる。
> その結果のポインタが、被参照型に関して正しく境界調整されていなければ、
> その動作は未定義とする。
> そうでない場合、再び型変換で元の型に戻すならば、
> その結果は元のポインタと比較して等しくなければならない。
についてです。
境界調整されていなければ未定義っていうことは、
境界調整されていれば未定義ではないということでしょうか?
未定義ではないということはどこかに定義があるのでしょうか?
っていうか境界調整って何よ?
私には定義が見付けられませんでした。
0146デフォルトの名無しさん
2010/08/28(土) 11:21:28どうでもいい話ですが、
>境界調整されていなければ未定義っていうこと‥‥�@
の対偶は
定義されておれば、それは境界調整されている。
です。
�@が成立するからといって、その裏命題の
> 境界調整されていれば未定義ではない
が論理的に導かれるわけではないことに、注意しなければなりません。
0147デフォルトの名無しさん
2010/08/28(土) 11:43:473.2 は見た?
0148145
2010/08/28(土) 18:21:45A* を B* に変換して先頭のメンバにアクセスした結果は変換前と同じかどうか確認したかったのです。
6.2.5 の「構造体型へのポインタは、すべて同じ表現及び同じ境界調整要求をもたなければならない。」
と合わせて考えると、この場合は期待通りになると解釈できそうですね。
0149デフォルトの名無しさん
2010/08/28(土) 18:46:050150145
2010/08/28(土) 19:04:52規格内かどうかにかかわらず自分が書くコードでポインタのキャストはしませんが、
初心者の知人がブログで書いてたコードでポインタのキャストをしてたので、
それが規格内なのかどうか確認したかったんです。
規格内だとするとそれがよくないスタイルだと説明する根拠がひとつ減っちゃうな。
0151デフォルトの名無しさん
2010/08/28(土) 20:47:03ISO/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
実際のコードがどのようなものかわからないとなんとも
そのブログなりコード片なり頼む
0152デフォルトの名無しさん
2010/08/28(土) 20:47:15キャストについては問題ないんだけど、その後のアクセスについてはさらに 6.5 p7 で
許されているものに限らないといけない。これについても >148 にある先頭の int への
アクセスに限れば 6.7.2.1 p13 にあるルールにより、問題は無い。
0153デフォルトの名無しさん
2010/08/28(土) 20:48:28#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); }
0154デフォルトの名無しさん
2010/08/28(土) 20:49:14#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++;
}
}
0155152
2010/08/28(土) 20:50:510156デフォルトの名無しさん
2010/08/28(土) 21:17:11なるんじゃないかとは思っていたが、本当になるとは
まぁまぁ、規格について話せれば、その他の細かいことは気にしない
>151, 153, 154
規格からこのようなコードなら大丈夫なのではないかと考えられたので、試しに書いただけです
自信無いです、ツッコミ歓迎です
0157デフォルトの名無しさん
2010/08/28(土) 21:22:580158デフォルトの名無しさん
2010/08/28(土) 21:23:44set_bar_t(b, 20, 200) の中の b->e で、直前に struct foo の b (あるいはパディング)として
使っていた領域に無理やり struct bar の e としてアクセスしてるのがダメっぽい。
0159デフォルトの名無しさん
2010/08/28(土) 23:13:17lintとかコンパイラの警告高くするとうるさいから
参照するけど使いませんよと示す意図
>158
たしかに、struct fooのaとbの間にパディングが無いという保証はされていない
入る可能性があるとは書かれているが、こういう場合には入らないというのを一応探してみる
ちなみに、6.2.6.1にパディングに値を入れるのはunspecified behavior(未規定動作)として書かれている
未規定だから期待どおりに動かなくても文句はいえないし、その環境でたまたまうまくいっただけだからダメだね
では、correctly aligned(境界調整)っていうのは、
struct bar_ {
int d; int e; char *f;
};
こういうことなのか
0160デフォルトの名無しさん
2010/08/28(土) 23:21:28> lintとか
では規格に違反しないためではないんだな?
0161デフォルトの名無しさん
2010/09/18(土) 12:46:29T* b = NULL;
T が任意のオブジェクト型のとき (uintptr_t)a == (uintptr_t)b の真偽は処理系に依存しますか?
0162デフォルトの名無しさん
2010/09/19(日) 00:24:170163デフォルトの名無しさん
2010/09/19(日) 11:18:04ありがとうございました。
NULL ポインタについては ttp://www.kouno.jp/home/c_faq/c5.html に詳しく書かれていて、
現実に型が違うとポインタのビット数や内部表現が違う処理系もあるみたいですね。
(uintptr_t)a == (uintptr_t)(void*)b とすると両辺が void* の NULL から uintptr_t
に変換されるから真になると考えていいでしょうか?
0164デフォルトの名無しさん
2010/09/21(火) 13:19:21スレ的には、キャストにそういう期待を
してはいけない、にしかならんだろ。
それでもぶっとおすのも自由。w
0165デフォルトの名無しさん
2010/11/01(月) 17:36:52http://studiokingyo.fc2web.com/
0166天使 ◆uL5esZLBSE
2011/07/02(土) 12:05:41.00仕事で仕方なくならわかるけど
家でもJAVAやってるなら本当にバカだよね。哀れゴミだし
0167天使 ◆uL5esZLBSE
2011/07/05(火) 08:05:52.88仕事で仕方なくならわかるけど
家でもJAVAやってるなら本当にバカだよね。哀れ
ゴミの分際でw
0168デフォルトの名無しさん
2011/07/05(火) 09:39:13.300169デフォルトの名無しさん
2011/07/05(火) 17:29:59.410170天使 ◆uL5esZLBSE
2011/07/06(水) 01:10:53.660171デフォルトの名無しさん
2011/07/06(水) 17:51:53.360172デフォルトの名無しさん
2011/07/07(木) 14:02:40.580173ななし。
2011/07/27(水) 14:40:56.960174デフォルトの名無しさん
2011/07/27(水) 14:46:42.71こういう時ばかり2ちゃんねらー利用しようとするとかどんだけ。
0175デフォルトの名無しさん
2011/09/13(火) 04:20:39.73C++ だと 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 ..." とあるものの、このほかに
配列終端のパディングを禁止するような規定は見当たらない感じです。
0176デフォルトの名無しさん
2011/09/13(火) 04:37:20.73C でも C++ でもその 2 つは絶対にイコールにならない
http://codepad.org/AmTDVSo8
0177デフォルトの名無しさん
2011/09/13(火) 08:36:23.81質問における T は変数名じゃなくて、型名を意図している(ものと思われる)。
配列型の、仮引数ではない変数について sizeof foo / sizeof foo[0] のようにして、
配列の個数を求めること、が規格中に sizeof の用途として示されてるので、
多分そう仮定して大丈夫という気はするが...
0178デフォルトの名無しさん
2011/09/13(火) 08:57:40.87それなら問題ない。
0179175
2011/09/13(火) 10:55:52.54すいません。 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
0180デフォルトの名無しさん
2011/09/13(火) 23:20:00.990181デフォルトの名無しさん
2011/10/04(火) 03:16:29.72-3 >> 1 なら -2 になるみたいだけど、2^n 以外でも割りたいしなぁ。
0182デフォルトの名無しさん
2011/12/25(日) 21:04:10.300183デフォルトの名無しさん
2011/12/28(水) 23:23:27.300184デフォルトの名無しさん
2012/03/06(火) 23:26:56.02何これ?3 / 2 が 2 になるのは初めて聞いたんだけど
そういう事してる言語とか数学とかあんの?
0185デフォルトの名無しさん
2012/03/06(火) 23:49:31.98別に-∞への丸めでもいいんじゃないの?
0186はちみつ餃子 ◆8X2XSCHEME
2012/03/06(火) 23:51:52.393 / 2 じゃなくて -3 / 2 の話だろ。
商が負のときにゼロ側に丸めるかマイナス無限側にまるめるかは言語によってどっちもあるよ。
mod 3 で
4 ≡ 1 ≡ -2 ≡ -5
でも
-5 ÷ 3 = -2 ... 1 がいい?
それとも
-5 ÷ 3 = -1 ... -2 がいい?
0188デフォルトの名無しさん
2012/03/07(水) 20:31:48.200189SCHEME餃子 ◆8X2XSCHEME
2012/03/07(水) 20:48:56.59Haskell だと quot と div だな。
0190デフォルトの名無しさん
2012/03/07(水) 21:39:49.420191デフォルトの名無しさん
2012/03/08(木) 08:29:05.96どっちがいいかは、はっきり言って慣れ。
0192デフォルトの名無しさん
2012/03/12(月) 13:03:19.890193デフォルトの名無しさん
2012/03/12(月) 14:03:39.51最低限保証しなければならない範囲は同じだが?
0194デフォルトの名無しさん
2012/03/12(月) 14:47:37.98俺はサッパリ理解できないんだけど
0195デフォルトの名無しさん
2012/03/15(木) 00:44:28.550196デフォルトの名無しさん
2012/03/15(木) 07:33:26.610197デフォルトの名無しさん
2012/03/15(木) 07:59:23.48あまりにも天然な問いには誰も答えない
0198営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 21:52:58.200199営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 02:44:20.60ISO/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.
0200営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 10:38:51.390201営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 11:49:32.540202デフォルトの名無しさん
2012/04/16(月) 23:55:42.85Cでは作れないんですか?
0203デフォルトの名無しさん
2012/04/17(火) 00:13:08.190204デフォルトの名無しさん
2012/04/17(火) 00:31:38.29Cでもできました。変数名とは名前空間が違うみたいですね。
リファなくてすみません。
0205デフォルトの名無しさん
2012/06/26(火) 06:15:21.260206デフォルトの名無しさん
2012/06/26(火) 09:08:01.40このスレが134番目ってことだが。そんなことも判らないでよく生きてこれたな。
■ このスレッドは過去ログ倉庫に格納されています