トップページ⇒tech
206コメント54KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/06/28(日) 00:18:42
このスレは標準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/

【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。
0002デフォルトの名無しさん2009/06/28(日) 01:07:44
>>1乙
0003デフォルトの名無しさん2009/06/28(日) 13:04:19
いちょつ
0004デフォルトの名無しさん2009/06/30(火) 19:12:41
「構造体オブジェクトへのポインタは、適切に変換すれば、その先頭メンバを指す。
更に、逆も成り立つ。」
とありますが void* へのキャストを経由して変換しても問題ありませんか?

「与えられた境界調整をもつオブジェクトへのポインタは、同じか、より制限の弱い
境界調整を持つオブジェクトへのポインタに型変換して、再び元に戻してもよいこと
を保証する。その結果は、元のポインタと比較して等しくなければならない。」
これは最初の型と戻した型が同じ場合ですよね。
0005デフォルトの名無しさん2009/06/30(火) 22:39:42
>>1乙
0006デフォルトの名無しさん2009/07/01(水) 01:44:42
>>4
1. yes.
2. yes.
0007デフォルトの名無しさん2009/07/14(火) 07:10:13
**argvって変更してもいいの?
0008デフォルトの名無しさん2009/07/14(火) 09:55:24
だめ
0009デフォルトの名無しさん2009/07/14(火) 12:38:59
たしか、絶対駄目ではないが、
それなりに自己責任。
0010デフォルトの名無しさん2009/07/14(火) 23:06:36
ダメならconst修飾させられるだろうな
0011デフォルトの名無しさん2009/07/14(火) 23:57:08
>>10
過去との互換性でconstをつけられなかったのかもしれない。
いずれにしても、環境依存だと思われ。
0012デフォルトの名無しさん2009/07/19(日) 05:49:28
お前ら嘘言うなよ
argvは変更していい
ちゃんと規格で保証されてる
0013デフォルトの名無しさん2009/07/19(日) 05:54:37
だいたい「駄目じゃないけどそれなりに自己責任」とか
「・・・だろうな」とか適当なこと言ってて恥ずかしくないのか

初心者はスレタイ嫁
0014デフォルトの名無しさん2009/07/19(日) 09:52:32
レスポンスする人は、どの規格書のどのセクションに書いてあるかを示してから、レスポンスする。 (次からテンプレ)

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
でも同様のセクションに同様のことが書かれている。
0015デフォルトの名無しさん2009/07/19(日) 11:34:45
C89の仕様書って、今手に入れるにはどうしたら?
0016デフォルトの名無しさん2009/07/19(日) 12:33:10
ANSIやISOは知らないけど、JISだと改訂された規格は
そもそもなかったことになるので、公式なところからはもう手に入らない。
古書マーケットに流れてるのを捕まえるとかしかないと思う。

まあ見るだけならそれなりの図書館行けば収蔵されてるだろうけど。
0017デフォルトの名無しさん2009/07/19(日) 14:52:19
>>14
そりゃ Rationale には書いてないだろう
規格書の方には Progarm startup の節に同じことが書いてある
ので C89 でも書き換えていい
0018デフォルトの名無しさん2009/07/19(日) 15:12:23
>>17 確かにおっしゃる通り。ANSI Cには
2.1.2.2 Hosted environment
Program startup
に全く同じことが書かれていた。

ということで、C90でもC99でもC1xでも変更しても良いことになっている。
0019デフォルトの名無しさん2009/07/19(日) 18:45:19
単なる仮引数なのだから、禁止する規則がない限り
書き換えてよいと解釈するべきだろう。
0020デフォルトの名無しさん2009/07/20(月) 13:02:26
スタートアップがROM化されてる
可能性があるのだから、書き換えは
自己責任だろ。
0021デフォルトの名無しさん2009/07/20(月) 15:14:25
ホスト環境とフリースタンディング環境の区別が付くようになってから書き込んでください
0022デフォルトの名無しさん2009/07/20(月) 21:18:18
そういや、ユーザ定義関数の仮引数に代入してもいいってのは
どこに書いてあるんだっけ?
0023202009/07/21(火) 12:44:15
>>21
区別はわかってるつもりですが、
問題がありますか?

>>19
ちなみに>>7は、仮引数自体じゃなくて、
それがさす先(**argv)の変更を聞いて
いるようですが。
0024デフォルトの名無しさん2009/07/21(火) 18:09:03
> 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"についてのみ言明すればよかったはず。
0025デフォルトの名無しさん2009/07/21(火) 18:34:17
> 「他で制限されてない限り、仮引数はmodifiableである」というのが正しければ、
そうは書いてないの?
0026デフォルトの名無しさん2009/07/21(火) 20:52:12
>>25
>22が上で聞いているが、そういう記述はない。
>19の解釈を採用すれば問題ないが。
0027デフォルトの名無しさん2009/07/22(水) 18:13:10
関数の引数はローカル変数扱いだろうが。
0028デフォルトの名無しさん2009/07/22(水) 18:38:01
>>27
規格へのポインタがヌルだよ
0029デフォルトの名無しさん2009/07/22(水) 18:45:40
>>24
main関数はいろいろ特別だから、
明記する必要があるのでは。

たしか、ユーザーが呼び出すのも
厳密にはダメだよね。
0030デフォルトの名無しさん2009/07/23(木) 02:22:52
Cではmain再帰は特に禁止されてない。C++では駄目だけど。
0031デフォルトの名無しさん2009/07/23(木) 02:24:13
だからそれがどこに書かれているのか示してくれと何度言えばわかるんだ
0032デフォルトの名無しさん2009/07/23(木) 02:40:20
特に禁止されてない。つまり何も書いてない。
0033デフォルトの名無しさん2009/07/23(木) 03:59:50
C++での話だ
0034デフォルトの名無しさん2009/07/23(木) 04:04:14
ここはCの規格スレ
0035デフォルトの名無しさん2009/07/23(木) 04:10:41
だったら言うなってんだ
0036デフォルトの名無しさん2009/07/23(木) 04:26:17
スレ違いの話題は他所でやってください
0037デフォルトの名無しさん2009/07/23(木) 04:31:52
スレ違い
0038デフォルトの名無しさん2009/07/23(木) 04:41:48
>>30 Cでは禁止されていないが、C++では禁止
>>31 C++で禁止されていることはどこに書かれている?
>>32 Cでは禁止されてない
>>33 いやいや、C++の方
>>34 ここCスレだからそれはどうでもいい
>>35 ???<ここが分からん
0039デフォルトの名無しさん2009/07/23(木) 22:01:32
>>38
34と35は投稿時刻が近いから、35は34を見ず、33に対してC++の話はすんな、と言っているのではないだろうか。
0040デフォルトの名無しさん2009/07/23(木) 23:31:41
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0041デフォルトの名無しさん2009/07/23(木) 23:56:06
ビットをシフトするのに役立つ
0042デフォルトの名無しさん2009/07/24(金) 00:20:43
>>40
そのコピペを作るのに役に立った
0043デフォルトの名無しさん2009/07/24(金) 00:55:36
>>1
0044デフォルトの名無しさん2009/08/12(水) 21:19:39
あげ
0045デフォルトの名無しさん2009/08/22(土) 18:15:46
c99の書式で解説しているcの入門書はありまつか
0046デフォルトの名無しさん2009/08/22(土) 18:34:49
入門レベルでC89とC99で違うようなところってあるかな?
0047デフォルトの名無しさん2009/08/22(土) 20:59:56
boolean型
宣言時の暗黙の型の禁止
変数宣言の位置
などは最初から覚えたほうがいい希ガス
0048デフォルトの名無しさん2009/08/27(木) 02:38:16
C89とClean Cはどこが違うの?
0049デフォルトの名無しさん2009/08/27(木) 10:55:17
Clean Cって?
0050デフォルトの名無しさん2009/08/27(木) 22:36:49
http://www.amazon.co.jp/gp/product/product-description/4434124234/ref=dp_proddesc_0?ie=UTF8&n=465392&s=books

Clean C----規格Cと規格C++の部分集合----
0051デフォルトの名無しさん2009/10/06(火) 09:12:06
T **からvoid **へのキャストは規格上できるんだっけ(Tはvoid以外)
0052デフォルトの名無しさん2009/10/06(火) 10:24:47
いいえ
void*だけ
0053デフォルトの名無しさん2009/10/06(火) 12:21:21
ありがとうございます
つまり、T **からvoid *へのキャストはできる(その後、T **にキャストしなおすことも)

なぜvoid *があるのにvoid **にキャストしようとしたのか理解に苦しむ人がいた
っていうか僕だった
0054デフォルトの名無しさん2009/10/06(火) 12:28:25
まあvoid *型というのはvoid型と違って具体的に存在する型なので、
void *を指すポインタの型としてvoid **型は使うからね。
0055デフォルトの名無しさん2009/10/13(火) 22:00:16
void * を指すポインタの型は void * ではないでしょうか。
0056デフォルトの名無しさん2009/10/13(火) 22:10:39
>>55
普通に考えてvoid**だろうが。もちろんvoid*に暗黙的に変換することは可能だが
0057デフォルトの名無しさん2009/10/13(火) 22:22:18
はたしてそうだろうか
0058デフォルトの名無しさん2009/10/14(水) 08:34:07
ということにしたいのですね。

 ヘ_ヘ
ミ ・ ・ ミ
 ( ° )〜
0059デフォルトの名無しさん2009/10/14(水) 09:20:29
いいえ事実です.
0060デフォルトの名無しさん2009/10/19(月) 11:21:38
struct foo_t f = {};
これでfの各メンバが初期化される保証はありますか?
0061デフォルトの名無しさん2009/10/19(月) 11:27:55
>>60
空のイニシャライザは認められない。
{0} などと最低一つは中身を書く必要がある。
0062デフォルトの名無しさん2009/10/19(月) 11:31:36
>>61
どうも。
{}でコンパイルできちゃったけどこれはGCCの拡張なのね
0063デフォルトの名無しさん2009/10/27(火) 21:30:44
infとnanについて聞きたいんですけど

infでない正の実数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:00
infやnanなんてものの存在自体が処理系依存なので・・・
0065デフォルトの名無しさん2009/10/28(水) 11:14:55
んなことはない。IEEE754読め
0066デフォルトの名無しさん2009/10/28(水) 11:21:15
浮動小数にIEEE754が使われているかどうかが処理系依存
わかるかね
0067デフォルトの名無しさん2009/10/28(水) 23:02:24
> 処理系依存

用語がスレ違い
0068デフォルトの名無しさん2009/10/29(木) 14:22:47
はい?
0069デフォルトの名無しさん2009/11/27(金) 21:57:14
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0070デフォルトの名無しさん2009/11/27(金) 22:25:58
何度目だナウシカ

そのコピペを作るのに役に立ちます
と合いの手で答えてあげるべきか
0071デフォルトの名無しさん2009/11/27(金) 22:40:43
ビットシフトはなんね役に立つのでしょうか?
0072デフォルトの名無しさん2009/11/27(金) 23:48:44
C言語をはじめたばかりであまりわからないのですが、
void 型ってなんの役に立つのでしょうか?
例えばint型にしておけばいいと思うのですが。
0073デフォルトの名無しさん2009/11/27(金) 23:52:36
int型にして戻り値は何を返すの?
0074デフォルトの名無しさん2009/11/28(土) 00:17:43
>>73
はい。return 0;でも、return 1;でも、適当に何か返して
おけばいいような気がするのですが。
呼び出し元は戻り値を無視すればいいわけですし。
だから、void型なんていらないと思うのです。
0075デフォルトの名無しさん2009/11/28(土) 00:40:55
俺はautoが何の役に立つのか分からん。昔は明示しなければならなかったの?
0076デフォルトの名無しさん2009/11/28(土) 03:16:10
うん。パーサの簡略化のためにストレージクラスが必要な時代もあった
0077デフォルトの名無しさん2009/11/28(土) 08:18:25
>>72
戻り値を使わないことをコンパイラに教えると
値を返す部分のコードをコンパイラが書かないので
まあそう言われると今時たいしてうれしくはないな
0078デフォルトの名無しさん2009/11/28(土) 09:13:14
>>74
voidでない関数の返す値を無視する場合
(void)printf("foo");
のように明示的にキャストしないと、注意してくるLintがあったりするので、
voidならvoidのほうが良い。
0079デフォルトの名無しさん2009/11/28(土) 10:29:21
>>74
役に立つとかの視点じゃなくて
戻り値を戻さないことで、関数内で処理が完結してることを明示してる
変に無意味な戻り値を返すと、使用側が混乱するかもねー

てか、このスレじゃなくて初心者スレで聞いたほうがいいよー
0080722009/11/28(土) 12:13:10
お前ら、なんでマジレスしてんだ?
スルーしろよ。
0081デフォルトの名無しさん2009/11/28(土) 12:32:02
つまんね
0082デフォルトの名無しさん2009/11/28(土) 12:52:27
>>75-76

つーかB言語のなごりだな
0083デフォルトの名無しさん2009/11/28(土) 18:25:26
>>72
void * はある程度のレベルになると便利に使えます。キャストを多用するため型チェックがきかなくなるのが欠点ですが。
たとえば、http://codepad.org/qS3Gh6kJ
(宿題スレの産物です。)
0084デフォルトの名無しさん2009/11/28(土) 19:12:54
それは void * だし
質問してるのは  void だし
0085デフォルトの名無しさん2009/11/28(土) 22:08:02
void f( void ); と int f( int );
だと、前者を呼ぶにはf();とすればいいけど、
後者を呼ぶにはf(n)としなくちゃいけないじゃないか。
タイプ量が増えて疲れる。
0086デフォルトの名無しさん2009/11/29(日) 00:19:27
リエントラントとしてはvoidの方がいい
0087デフォルトの名無しさん2009/11/29(日) 19:43:13
>>76
そんな時代があったことはない。
0088デフォルトの名無しさん2009/11/30(月) 23:48:08
C言語をはじめたばかりであまりわからないのですが、
マウスから酢昆布のような臭いがするんですけど
どうしたらいいですか?
0089デフォルトの名無しさん2009/11/30(月) 23:53:24
あなたにふさわしいマウスです
0090デフォルトの名無しさん2009/11/30(月) 23:55:28
初心者は来るな
0091デフォルトの名無しさん2009/12/23(水) 06:22:56
C言語をはじめたばかりであまりわからないのですが、
手袋にマウスの酢昆布のような臭いが移ったんですけど
どうしたらいいですか?
0092デフォルトの名無しさん2009/12/23(水) 08:46:36
初心者お断り
スレタイくらい読まないか
0093デフォルトの名無しさん2009/12/23(水) 12:56:06
僕もみなさんのようにC言語で自称プログラマーごっこしたいのですが、まず何をすればですか?
0094デフォルトの名無しさん2009/12/23(水) 13:06:10
まずUNIXをハックします
0095デフォルトの名無しさん2009/12/29(火) 17:06:33
C言語をはじめたばかりであまりわからないのですが、
雪も降ってるのに部屋に暖房が無くて寒いんですけど
どうしたらいいですか?
0096デフォルトの名無しさん2009/12/29(火) 17:21:00
CPUをフルパワーで回し続ければ廃熱で温まるYO!
0097デフォルトの名無しさん2009/12/29(火) 21:40:11
int main()
{

}
0098デフォルトの名無しさん2009/12/29(火) 21:42:07
>>96
これを実行するわけだな

int main()
{
while( 1 );
return 0;
}
0099デフォルトの名無しさん2009/12/29(火) 21:45:28
やたー暖房プログラムできたよー

int main()
{
   while(1);
}
0100992009/12/29(火) 21:46:30
ネタ被りサーセン
0101デフォルトの名無しさん2009/12/29(火) 21:51:06
でも最近のマシン速いから無限ループくらいものの数秒で終了するんだろ?
0102デフォルトの名無しさん2009/12/29(火) 21:52:47
終了しないプログラムでも
ソースコードでは戻り値は返さないといけない
0103デフォルトの名無しさん2009/12/30(水) 02:09:08
CPUの消費電力上げるなら、キャッシュとかパイプラインとか
浮動小数点レジスタとか、CPUを出来るだけ全面使った方がいいかも
0104デフォルトの名無しさん2009/12/30(水) 13:03:47
>>102
main()はreturnを省略するとreturn 0;と同値になる。
0105デフォルトの名無しさん2010/01/26(火) 13:58:36
関数へのポインタをprintf系関数で表示させる方法って無いんだな。%pってvoid*だから関数ポインタと互換無いし。
0106デフォルトの名無しさん2010/01/26(火) 14:08:39
intptr_t への変換すら明言されてないんだっけ?
0107デフォルトの名無しさん2010/01/26(火) 18:28:12
>>105
普通に 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:31
このスレでその発言は痛いな
0109デフォルトの名無しさん2010/01/27(水) 09:46:30
107が「普通に void * にキャスト」できる根拠を示せれば問題ないよ!
0110デフォルトの名無しさん2010/01/30(土) 07:38:27
規格準拠専用スレなのに、ほとんどのやつが規格を持ってさえいない…
0111デフォルトの名無しさん2010/01/30(土) 15:56:16
規格票は持っているが規格は持っていない
0112デフォルトの名無しさん2010/02/02(火) 03:45:46
規格書を引用しない奴は出ていけ
0113デフォルトの名無しさん2010/02/02(火) 19:54:27
どの版持ってればいい?
0114デフォルトの名無しさん2010/02/17(水) 20:49:43
C言語をはじめたばかりであまりわからないのですが、
尿をすると時折尿道がズキズキとひどく痛む事があるんですけど
何かの病気でしょうか?
0115デフォルトの名無しさん2010/02/17(水) 21:28:56
P
0116デフォルトの名無しさん2010/02/17(水) 21:51:36
free(penis);
が抜けてるんじゃないかな
0117デフォルトの名無しさん2010/02/19(金) 02:36:42
以下のような構造体へのポインタのキャストは許されているかどうか
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;
}
0118デフォルトの名無しさん2010/02/19(金) 02:46:43
>>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 の先頭要素である場合に限って安全。
0119デフォルトの名無しさん2010/02/19(金) 02:57:09
>118
素早い回答ありがとうございました
0120デフォルトの名無しさん2010/02/19(金) 07:33:49
「安全」をどういう意味で使っているのか知らないが、
言語規格ではポインタ型のキャストは特定の場合を除いて処理系定義動作。
したがって、

> 以下のような構造体へのポインタのキャストは許されているかどうか

に対する答は「処理系による」

01211182010/02/19(金) 08:52:24
>>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 の引用文が続くんだけど、キャストが安全かどうかとは関係ないね。
0122デフォルトの名無しさん2010/03/27(土) 14:10:25
C言語をはじめたばかりであまりわからないのですが、
フルートの最低音の C が鳴らせません。
どうしたらいいでしょうか?
0123デフォルトの名無しさん2010/03/27(土) 17:24:45
がんばれ
0124デフォルトの名無しさん2010/04/12(月) 17:03:59
C言語をはじめたばかりであまりわからないのですが、
人生が終わりそうです。
どうしたらいいでしょうか?
0125デフォルトの名無しさん2010/04/12(月) 17:10:31
ビットシフトってなんの役に立つの?
0126デフォルトの名無しさん2010/04/12(月) 17:17:56
goto 人生のスタートライン

>>125
そのコピペを作るのに役に立ってる
0127ノラ2010/04/29(木) 00:08:46
すいませんが教えてほしいことがあります
いま学校の課題で、1+2+3・・・というように加算していき、
加算結果が300を超えたら表示し、処理を終了するプログラムを
作りたいのですが、わかる方いましたら、教えてください。
ちなみにdo-whileで作るのが条件です。
お願いします。
0128デフォルトの名無しさん2010/04/29(木) 00:21:17
>>127
>>1をよく読め
http://pc12.2ch.net/test/read.cgi/tech/1270909823/
こっちでやれ
0129デフォルトの名無しさん2010/05/31(月) 18:23:10
C言語をはじめたばかりであまりわからないのですが、
トイレに行きたいです。
どうしたらいいでしょうか?
0130デフォルトの名無しさん2010/05/31(月) 18:35:03
しばらく我慢するしかないと思う
0131デフォルトの名無しさん2010/05/31(月) 18:43:15
ありがとうございました、我慢します。
0132デフォルトの名無しさん2010/05/31(月) 20:22:33
そろそろ漏れそうなのですが。
0133デフォルトの名無しさん2010/05/31(月) 22:05:51
core dumpとうまく付き合っていかないとダメだからなぁ。
どこまで我慢すべきかもそのうち分かってくると思う。
0134デフォルトの名無しさん2010/06/24(木) 00:11:27
C言語をはじめたばかりであまりわからないのですが、
飼い猫に「お前は何で猫なんだ」と問いかけても反応が無いのですが
どうしたらいいでしょうか?
あと、猫がなぜあれほど愛玩欲をかきたてられる存在なのかも教えてください。
0135デフォルトの名無しさん2010/06/24(木) 07:47:11
>>134
規格に明記されていないことは未定義動作。
猫の反応についての規定はないので、当然処理系ごとに反応は異なる。
0136デフォルトの名無しさん2010/06/24(木) 08:30:03
規格に未定義と明記してあるのが未定義動作
0137デフォルトの名無しさん2010/06/24(木) 08:35:09
必ず明記されるのは処理系定義と文化圏固有と未規定
未定義は言外に示されることがある
0138デフォルトの名無しさん2010/06/24(木) 19:02:21
未定義という言葉の意味からも分かるよね
未定義と明記してあるものも、
何も触れられていないものも、
どちらも未定義
0139デフォルトの名無しさん2010/07/13(火) 14:55:14
C言語をはじめたばかりであまりわからないのですが、
飼い猫が汲み置きの水には見向きもせず、水道の蛇口からの流水しか飲みません。
水道代がもったいないのですが、どうしたらいいですか?
0140デフォルトの名無しさん2010/07/13(火) 18:15:43
もったいないから空気吸うな
0141デフォルトの名無しさん2010/07/13(火) 22:21:17
すわせてください
しんでしまいます
0142デフォルトの名無しさん2010/07/13(火) 23:14:10
C言語をはじめたばかりであまりわからないのですが、

             / ̄\
            │34nm |
             \_/    インテル!
             _|_|_
       n:     /      \    n: 
       ||   /         ヽ    ||   
      f「| |^ト  |   :::\::/:::   |  「| |^|`|  エーーックス
      |: ::  ! }  | <(゚)>::::<(゚)> |  | !  : ::}   ニジュウゴ
      ヽ  ,イ  ヽ  (__人__) /  ヽ  ,イ     エーーーッムッッ!
            \ `⌒´ /
0143デフォルトの名無しさん2010/07/23(金) 13:42:07
C言語をはじめたばかりであまりわからないのですが、
変数を2乗するのに

i *= i;

って規格的にOKですか?
0144デフォルトの名無しさん2010/07/23(金) 13:48:12
うん
0145デフォルトの名無しさん2010/08/28(土) 10:00:57
JISX3010:2003 の 6.3.2.3 にある文

> オブジェクト型又は不完全型へのポインタは、
> 他のオブジェクト型又は不完全型へのポインタに型変換できる。
> その結果のポインタが、被参照型に関して正しく境界調整されていなければ、
> その動作は未定義とする。
> そうでない場合、再び型変換で元の型に戻すならば、
> その結果は元のポインタと比較して等しくなければならない。

についてです。
境界調整されていなければ未定義っていうことは、
境界調整されていれば未定義ではないということでしょうか?
未定義ではないということはどこかに定義があるのでしょうか?
っていうか境界調整って何よ?
私には定義が見付けられませんでした。
0146デフォルトの名無しさん2010/08/28(土) 11:21:28
>>145
どうでもいい話ですが、
>境界調整されていなければ未定義っていうこと‥‥�@
の対偶は
定義されておれば、それは境界調整されている。
です。
�@が成立するからといって、その裏命題の
> 境界調整されていれば未定義ではない
が論理的に導かれるわけではないことに、注意しなければなりません。
0147デフォルトの名無しさん2010/08/28(土) 11:43:47
>>145
3.2 は見た?
01481452010/08/28(土) 18:21:45
例えば、先頭に int のメンバを含む2種類の構造体 A, B があったとして、
A* を B* に変換して先頭のメンバにアクセスした結果は変換前と同じかどうか確認したかったのです。
6.2.5 の「構造体型へのポインタは、すべて同じ表現及び同じ境界調整要求をもたなければならない。」
と合わせて考えると、この場合は期待通りになると解釈できそうですね。
0149デフォルトの名無しさん2010/08/28(土) 18:46:05
共用体を知らないだけ?
01501452010/08/28(土) 19:04:52
共用体は知ってます。
規格内かどうかにかかわらず自分が書くコードでポインタのキャストはしませんが、
初心者の知人がブログで書いてたコードでポインタのキャストをしてたので、
それが規格内なのかどうか確認したかったんです。
規格内だとするとそれがよくないスタイルだと説明する根拠がひとつ減っちゃうな。
0151デフォルトの名無しさん2010/08/28(土) 20:47:03
>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
実際のコードがどのようなものかわからないとなんとも
そのブログなりコード片なり頼む
0152デフォルトの名無しさん2010/08/28(土) 20:47:15
>>150
キャストについては問題ないんだけど、その後のアクセスについてはさらに 6.5 p7 で
許されているものに限らないといけない。これについても >148 にある先頭の int への
アクセスに限れば 6.7.2.1 p13 にあるルールにより、問題は無い。
0153デフォルトの名無しさん2010/08/28(土) 20:48: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); }
0154デフォルトの名無しさん2010/08/28(土) 20:49:14
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++;
}
}
01551522010/08/28(土) 20:50:51
割り込んでスマンカッタ
0156デフォルトの名無しさん2010/08/28(土) 21:17:11
いや、さすがに無いレスを参照するような書き方が悪かった
なるんじゃないかとは思っていたが、本当になるとは
まぁまぁ、規格について話せれば、その他の細かいことは気にしない
>151, 153, 154

規格からこのようなコードなら大丈夫なのではないかと考えられたので、試しに書いただけです
自信無いです、ツッコミ歓迎です
0157デフォルトの名無しさん2010/08/28(土) 21:22:58
void にキャストする意図は?
0158デフォルトの名無しさん2010/08/28(土) 21:23:44
>>153-154
set_bar_t(b, 20, 200) の中の b->e で、直前に struct foo の b (あるいはパディング)として
使っていた領域に無理やり struct bar の e としてアクセスしてるのがダメっぽい。
0159デフォルトの名無しさん2010/08/28(土) 23:13:17
>157
lintとかコンパイラの警告高くするとうるさいから
参照するけど使いませんよと示す意図

>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
>>159

> lintとか

では規格に違反しないためではないんだな?
0161デフォルトの名無しさん2010/09/18(土) 12:46:29
void* a = NULL;
T* b = NULL;

T が任意のオブジェクト型のとき (uintptr_t)a == (uintptr_t)b の真偽は処理系に依存しますか?
0162デフォルトの名無しさん2010/09/19(日) 00:24:17
ポインタを整数にキャストした結果は処理系定義
0163デフォルトの名無しさん2010/09/19(日) 11:18:04
>>162
ありがとうございました。

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
>>163
スレ的には、キャストにそういう期待を
してはいけない、にしかならんだろ。

それでもぶっとおすのも自由。w
0165デフォルトの名無しさん2010/11/01(月) 17:36:52
参考
http://studiokingyo.fc2web.com/
0166天使 ◆uL5esZLBSE 2011/07/02(土) 12:05:41.00
2011年になっても未だにJAVA使い続けてる奴ってさ
仕事で仕方なくならわかるけど

家でもJAVAやってるなら本当にバカだよね。哀れゴミだし
0167天使 ◆uL5esZLBSE 2011/07/05(火) 08:05:52.88
2011年になっても未だにJAVA使い続けてる奴ってさ
仕事で仕方なくならわかるけど

家でもJAVAやってるなら本当にバカだよね。哀れ

ゴミの分際でw
0168デフォルトの名無しさん2011/07/05(火) 09:39:13.30
天使ちゃんマジ天使
0169デフォルトの名無しさん2011/07/05(火) 17:29:59.41
天使ちゃんマジスレ違い
0170天使 ◆uL5esZLBSE 2011/07/06(水) 01:10:53.66
死ねよ
0171デフォルトの名無しさん2011/07/06(水) 17:51:53.36
誰に言ってるの?
0172デフォルトの名無しさん2011/07/07(木) 14:02:40.58
統合失調症って辛そうだな
0173ななし。2011/07/27(水) 14:40:56.96
カ オ ス ラ ウ ン ジ ゆ る せ な ぁ い ー
0174デフォルトの名無しさん2011/07/27(水) 14:46:42.71
うぜぇぞふたば民。

こういう時ばかり2ちゃんねらー利用しようとするとかどんだけ。
0175デフォルトの名無しさん2011/09/13(火) 04:20:39.73
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 ..." とあるものの、このほかに
配列終端のパディングを禁止するような規定は見当たらない感じです。
0176デフォルトの名無しさん2011/09/13(火) 04:37:20.73
>>175
C でも C++ でもその 2 つは絶対にイコールにならない
http://codepad.org/AmTDVSo8
0177デフォルトの名無しさん2011/09/13(火) 08:36:23.81
>>176 えーとそれは質問を取り違えている。
質問における T は変数名じゃなくて、型名を意図している(ものと思われる)。

配列型の、仮引数ではない変数について sizeof foo / sizeof foo[0] のようにして、
配列の個数を求めること、が規格中に sizeof の用途として示されてるので、
多分そう仮定して大丈夫という気はするが...
0178デフォルトの名無しさん2011/09/13(火) 08:57:40.87
つまり、T foo[N]のときに sizeof(foo) = sizeof(T) * N かどうかということか?
それなら問題ない。
01791752011/09/13(火) 10:55:52.54
>>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
0180デフォルトの名無しさん2011/09/13(火) 23:20:00.99
そしてスルーされる>178
0181デフォルトの名無しさん2011/10/04(火) 03:16:29.72
C99 では -3 / 2 == -1 と決まってたんだね。-2 の方がよかったのに…。
-3 >> 1 なら -2 になるみたいだけど、2^n 以外でも割りたいしなぁ。
0182デフォルトの名無しさん2011/12/25(日) 21:04:10.30
C11記念age
0183デフォルトの名無しさん2011/12/28(水) 23:23:27.30
無名structとunionは嬉しいな
0184デフォルトの名無しさん2012/03/06(火) 23:26:56.02
>>181
何これ?3 / 2 が 2 になるのは初めて聞いたんだけど
そういう事してる言語とか数学とかあんの?
0185デフォルトの名無しさん2012/03/06(火) 23:49:31.98
0方向への丸めの方が一般的だと思ってたけど
別に-∞への丸めでもいいんじゃないの?
0186はちみつ餃子 ◆8X2XSCHEME 2012/03/06(火) 23:51:52.39
>>184
3 / 2 じゃなくて -3 / 2 の話だろ。
商が負のときにゼロ側に丸めるかマイナス無限側にまるめるかは言語によってどっちもあるよ。
0187 ◆QZaw55cn4c 2012/03/07(水) 19:45:25.55
合同式を考えると、正の場合と同じく、-∞側にまるめてくれたほうがいいと思うのですが、抵抗を感じる人も多いようですね。

mod 3 で
4 ≡ 1 ≡ -2 ≡ -5

でも
-5 ÷ 3 = -2 ... 1 がいい?
それとも
-5 ÷ 3 = -1 ... -2 がいい?
0188デフォルトの名無しさん2012/03/07(水) 20:31:48.20
そういうのはFortranに任せとけ
0189SCHEME餃子 ◆8X2XSCHEME 2012/03/07(水) 20:48:56.59
ちなみに Scheme では両方ある。 quotient と div 。
Haskell だと quot と div だな。
0190デフォルトの名無しさん2012/03/07(水) 21:39:49.42
正負の絶対値が異なる言語って辛くないのかなぁ
0191デフォルトの名無しさん2012/03/08(木) 08:29:05.96
どちらになるか、はっきりしていれば問題ない。
どっちがいいかは、はっきり言って慣れ。
0192デフォルトの名無しさん2012/03/12(月) 13:03:19.89
Cだとどうせ負の最大値の絶対値は表現できないから正負で丸める方向が違っても気にならんな。
0193デフォルトの名無しさん2012/03/12(月) 14:03:39.51
>>190
最低限保証しなければならない範囲は同じだが?
0194デフォルトの名無しさん2012/03/12(月) 14:47:37.98
正負の絶対値が異なるというのがどういうことか、みんなわかってるの?
俺はサッパリ理解できないんだけど
0195デフォルトの名無しさん2012/03/15(木) 00:44:28.55
文脈とか空気が読める人間なら解るんじゃないかな?
0196デフォルトの名無しさん2012/03/15(木) 07:33:26.61
規格には空気なんてないけどな
0197デフォルトの名無しさん2012/03/15(木) 07:59:23.48
スレにはあるね
あまりにも天然な問いには誰も答えない
0198営利利用に関するLR審議中@詳細は自治スレへ2012/03/30(金) 21:52:58.20
いつになったら引数なし関数の仮引数にvoidって書かなくてよくなるの?
0199営利利用に関するLR審議中@詳細は自治スレへ2012/03/31(土) 02:44:20.60
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.
0200営利利用に関するLR審議中@詳細は自治スレへ2012/03/31(土) 10:38:51.39
ありがとう 書かなくてよくはならなさそうですね
0201営利利用に関するLR審議中@詳細は自治スレへ2012/03/31(土) 11:49:32.54
C++へようこそ。
0202デフォルトの名無しさん2012/04/16(月) 23:55:42.85
どうしてC++では構造体/classと同名の変数が作れるのに
Cでは作れないんですか?
0203デフォルトの名無しさん2012/04/17(火) 00:13:08.19
紛らわしいから
0204デフォルトの名無しさん2012/04/17(火) 00:31:38.29
202です。
Cでもできました。変数名とは名前空間が違うみたいですね。
リファなくてすみません。
0205デフォルトの名無しさん2012/06/26(火) 06:15:21.26
Part134ってなに?
0206デフォルトの名無しさん2012/06/26(火) 09:08:01.40
>>205
このスレが134番目ってことだが。そんなことも判らないでよく生きてこれたな。
■ このスレッドは過去ログ倉庫に格納されています