09/06/28 00:18:42
このスレは標準C規格や規格に合致した移植性の高い記法・技法に関するスレです。
C言語初心者の初歩的な質問、GUIなどの標準Cではできない事の質問、
ソース丸投げ、宿題、書籍 などは専門の別スレッド↓があるのでそちらへ。
C言語なら俺に聞け(入門篇) Part 49
スレリンク(tech板)
【初心者歓迎】C/C++室 Ver.66【環境依存OK】
スレリンク(tech板)
C/C++の宿題片付けます 128代目
スレリンク(tech板)
【書き込む前に】
・まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
・質問する前には最低限検索を。
・エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
【参考文献】
C FAQ 日本語訳
URLリンク(www.kouno.jp)
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
URLリンク(www.amazon.co.jp)
【このスレのログ】
前スレ:スレリンク(tech板)
他の過去ログ:URLリンク(nssearch.hp.infoseek.co.jp)
【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。
2:デフォルトの名無しさん
09/06/28 01:07:44
>>1乙
3:デフォルトの名無しさん
09/06/28 13:04:19
いちょつ
4:デフォルトの名無しさん
09/06/30 19:12:41
「構造体オブジェクトへのポインタは、適切に変換すれば、その先頭メンバを指す。
更に、逆も成り立つ。」
とありますが void* へのキャストを経由して変換しても問題ありませんか?
「与えられた境界調整をもつオブジェクトへのポインタは、同じか、より制限の弱い
境界調整を持つオブジェクトへのポインタに型変換して、再び元に戻してもよいこと
を保証する。その結果は、元のポインタと比較して等しくなければならない。」
これは最初の型と戻した型が同じ場合ですよね。
5:デフォルトの名無しさん
09/06/30 22:39:42
>>1乙
6:デフォルトの名無しさん
09/07/01 01:44:42
>>4
1. yes.
2. yes.
7:デフォルトの名無しさん
09/07/14 07:10:13
**argvって変更してもいいの?
8:デフォルトの名無しさん
09/07/14 09:55:24
だめ
9:デフォルトの名無しさん
09/07/14 12:38:59
たしか、絶対駄目ではないが、
それなりに自己責任。
10:デフォルトの名無しさん
09/07/14 23:06:36
ダメならconst修飾させられるだろうな
11:デフォルトの名無しさん
09/07/14 23:57:08
>>10
過去との互換性でconstをつけられなかったのかもしれない。
いずれにしても、環境依存だと思われ。
12:デフォルトの名無しさん
09/07/19 05:49:28
お前ら嘘言うなよ
argvは変更していい
ちゃんと規格で保証されてる
13:デフォルトの名無しさん
09/07/19 05:54:37
だいたい「駄目じゃないけどそれなりに自己責任」とか
「・・・だろうな」とか適当なこと言ってて恥ずかしくないのか
初心者はスレタイ嫁
14:デフォルトの名無しさん
09/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
でも同様のセクションに同様のことが書かれている。
15:デフォルトの名無しさん
09/07/19 11:34:45
C89の仕様書って、今手に入れるにはどうしたら?
16:デフォルトの名無しさん
09/07/19 12:33:10
ANSIやISOは知らないけど、JISだと改訂された規格は
そもそもなかったことになるので、公式なところからはもう手に入らない。
古書マーケットに流れてるのを捕まえるとかしかないと思う。
まあ見るだけならそれなりの図書館行けば収蔵されてるだろうけど。
17:デフォルトの名無しさん
09/07/19 14:52:19
>>14
そりゃ Rationale には書いてないだろう
規格書の方には Progarm startup の節に同じことが書いてある
ので C89 でも書き換えていい
18:デフォルトの名無しさん
09/07/19 15:12:23
>>17 確かにおっしゃる通り。ANSI Cには
2.1.2.2 Hosted environment
Program startup
に全く同じことが書かれていた。
ということで、C90でもC99でもC1xでも変更しても良いことになっている。
19:デフォルトの名無しさん
09/07/19 18:45:19
単なる仮引数なのだから、禁止する規則がない限り
書き換えてよいと解釈するべきだろう。
20:デフォルトの名無しさん
09/07/20 13:02:26
スタートアップがROM化されてる
可能性があるのだから、書き換えは
自己責任だろ。
21:デフォルトの名無しさん
09/07/20 15:14:25
ホスト環境とフリースタンディング環境の区別が付くようになってから書き込んでください
22:デフォルトの名無しさん
09/07/20 21:18:18
そういや、ユーザ定義関数の仮引数に代入してもいいってのは
どこに書いてあるんだっけ?
23:20
09/07/21 12:44:15
>>21
区別はわかってるつもりですが、
問題がありますか?
>>19
ちなみに>>7は、仮引数自体じゃなくて、
それがさす先(**argv)の変更を聞いて
いるようですが。
24:デフォルトの名無しさん
09/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"についてのみ言明すればよかったはず。
25:デフォルトの名無しさん
09/07/21 18:34:17
> 「他で制限されてない限り、仮引数はmodifiableである」というのが正しければ、
そうは書いてないの?
26:デフォルトの名無しさん
09/07/21 20:52:12
>>25
>22が上で聞いているが、そういう記述はない。
>19の解釈を採用すれば問題ないが。
27:デフォルトの名無しさん
09/07/22 18:13:10
関数の引数はローカル変数扱いだろうが。
28:デフォルトの名無しさん
09/07/22 18:38:01
>>27
規格へのポインタがヌルだよ
29:デフォルトの名無しさん
09/07/22 18:45:40
>>24
main関数はいろいろ特別だから、
明記する必要があるのでは。
たしか、ユーザーが呼び出すのも
厳密にはダメだよね。
30:デフォルトの名無しさん
09/07/23 02:22:52
Cではmain再帰は特に禁止されてない。C++では駄目だけど。
31:デフォルトの名無しさん
09/07/23 02:24:13
だからそれがどこに書かれているのか示してくれと何度言えばわかるんだ
32:デフォルトの名無しさん
09/07/23 02:40:20
特に禁止されてない。つまり何も書いてない。
33:デフォルトの名無しさん
09/07/23 03:59:50
C++での話だ
34:デフォルトの名無しさん
09/07/23 04:04:14
ここはCの規格スレ
35:デフォルトの名無しさん
09/07/23 04:10:41
だったら言うなってんだ
36:デフォルトの名無しさん
09/07/23 04:26:17
スレ違いの話題は他所でやってください
37:デフォルトの名無しさん
09/07/23 04:31:52
スレ違い
38:デフォルトの名無しさん
09/07/23 04:41:48
>>30 Cでは禁止されていないが、C++では禁止
>>31 C++で禁止されていることはどこに書かれている?
>>32 Cでは禁止されてない
>>33 いやいや、C++の方
>>34 ここCスレだからそれはどうでもいい
>>35 ???<ここが分からん
39:デフォルトの名無しさん
09/07/23 22:01:32
>>38
34と35は投稿時刻が近いから、35は34を見ず、33に対してC++の話はすんな、と言っているのではないだろうか。
40:デフォルトの名無しさん
09/07/23 23:31:41
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
41:デフォルトの名無しさん
09/07/23 23:56:06
ビットをシフトするのに役立つ
42:デフォルトの名無しさん
09/07/24 00:20:43
>>40
そのコピペを作るのに役に立った
43:デフォルトの名無しさん
09/07/24 00:55:36
>>1
44:デフォルトの名無しさん
09/08/12 21:19:39
あげ
45:デフォルトの名無しさん
09/08/22 18:15:46
c99の書式で解説しているcの入門書はありまつか
46:デフォルトの名無しさん
09/08/22 18:34:49
入門レベルでC89とC99で違うようなところってあるかな?
47:デフォルトの名無しさん
09/08/22 20:59:56
boolean型
宣言時の暗黙の型の禁止
変数宣言の位置
などは最初から覚えたほうがいい希ガス
48:デフォルトの名無しさん
09/08/27 02:38:16
C89とClean Cはどこが違うの?
49:デフォルトの名無しさん
09/08/27 10:55:17
Clean Cって?
50:デフォルトの名無しさん
09/08/27 22:36:49
URLリンク(www.amazon.co.jp)
Clean C----規格Cと規格C++の部分集合----
51:デフォルトの名無しさん
09/10/06 09:12:06
T **からvoid **へのキャストは規格上できるんだっけ(Tはvoid以外)
52:デフォルトの名無しさん
09/10/06 10:24:47
いいえ
void*だけ
53:デフォルトの名無しさん
09/10/06 12:21:21
ありがとうございます
つまり、T **からvoid *へのキャストはできる(その後、T **にキャストしなおすことも)
なぜvoid *があるのにvoid **にキャストしようとしたのか理解に苦しむ人がいた
っていうか僕だった
54:デフォルトの名無しさん
09/10/06 12:28:25
まあvoid *型というのはvoid型と違って具体的に存在する型なので、
void *を指すポインタの型としてvoid **型は使うからね。
55:デフォルトの名無しさん
09/10/13 22:00:16
void * を指すポインタの型は void * ではないでしょうか。
56:デフォルトの名無しさん
09/10/13 22:10:39
>>55
普通に考えてvoid**だろうが。もちろんvoid*に暗黙的に変換することは可能だが
57:デフォルトの名無しさん
09/10/13 22:22:18
はたしてそうだろうか
58:デフォルトの名無しさん
09/10/14 08:34:07
ということにしたいのですね。
ヘ_ヘ
ミ ・ ・ ミ
( ° )~
59:デフォルトの名無しさん
09/10/14 09:20:29
いいえ事実です.
60:デフォルトの名無しさん
09/10/19 11:21:38
struct foo_t f = {};
これでfの各メンバが初期化される保証はありますか?
61:デフォルトの名無しさん
09/10/19 11:27:55
>>60
空のイニシャライザは認められない。
{0} などと最低一つは中身を書く必要がある。
62:デフォルトの名無しさん
09/10/19 11:31:36
>>61
どうも。
{}でコンパイルできちゃったけどこれはGCCの拡張なのね
63:デフォルトの名無しさん
09/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 常に真
これらは処理系によらず正しいでしょうか?
64:デフォルトの名無しさん
09/10/28 10:30:00
infやnanなんてものの存在自体が処理系依存なので・・・
65:デフォルトの名無しさん
09/10/28 11:14:55
んなことはない。IEEE754読め
66:デフォルトの名無しさん
09/10/28 11:21:15
浮動小数にIEEE754が使われているかどうかが処理系依存
わかるかね
67:デフォルトの名無しさん
09/10/28 23:02:24
> 処理系依存
用語がスレ違い
68:デフォルトの名無しさん
09/10/29 14:22:47
はい?
69:デフォルトの名無しさん
09/11/27 21:57:14
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
70:デフォルトの名無しさん
09/11/27 22:25:58
何度目だナウシカ
そのコピペを作るのに役に立ちます
と合いの手で答えてあげるべきか
71:デフォルトの名無しさん
09/11/27 22:40:43
ビットシフトはなんね役に立つのでしょうか?
72:デフォルトの名無しさん
09/11/27 23:48:44
C言語をはじめたばかりであまりわからないのですが、
void 型ってなんの役に立つのでしょうか?
例えばint型にしておけばいいと思うのですが。
73:デフォルトの名無しさん
09/11/27 23:52:36
int型にして戻り値は何を返すの?
74:デフォルトの名無しさん
09/11/28 00:17:43
>>73
はい。return 0;でも、return 1;でも、適当に何か返して
おけばいいような気がするのですが。
呼び出し元は戻り値を無視すればいいわけですし。
だから、void型なんていらないと思うのです。
75:デフォルトの名無しさん
09/11/28 00:40:55
俺はautoが何の役に立つのか分からん。昔は明示しなければならなかったの?
76:デフォルトの名無しさん
09/11/28 03:16:10
うん。パーサの簡略化のためにストレージクラスが必要な時代もあった
77:デフォルトの名無しさん
09/11/28 08:18:25
>>72
戻り値を使わないことをコンパイラに教えると
値を返す部分のコードをコンパイラが書かないので
まあそう言われると今時たいしてうれしくはないな
78:デフォルトの名無しさん
09/11/28 09:13:14
>>74
voidでない関数の返す値を無視する場合
(void)printf("foo");
のように明示的にキャストしないと、注意してくるLintがあったりするので、
voidならvoidのほうが良い。
79:デフォルトの名無しさん
09/11/28 10:29:21
>>74
役に立つとかの視点じゃなくて
戻り値を戻さないことで、関数内で処理が完結してることを明示してる
変に無意味な戻り値を返すと、使用側が混乱するかもねー
てか、このスレじゃなくて初心者スレで聞いたほうがいいよー
80:72
09/11/28 12:13:10
お前ら、なんでマジレスしてんだ?
スルーしろよ。
81:デフォルトの名無しさん
09/11/28 12:32:02
つまんね
82:デフォルトの名無しさん
09/11/28 12:52:27
>>75-76
つーかB言語のなごりだな
83:デフォルトの名無しさん
09/11/28 18:25:26
>>72
void * はある程度のレベルになると便利に使えます。キャストを多用するため型チェックがきかなくなるのが欠点ですが。
たとえば、URLリンク(codepad.org)
(宿題スレの産物です。)
84:デフォルトの名無しさん
09/11/28 19:12:54
それは void * だし
質問してるのは void だし
85:デフォルトの名無しさん
09/11/28 22:08:02
void f( void ); と int f( int );
だと、前者を呼ぶにはf();とすればいいけど、
後者を呼ぶにはf(n)としなくちゃいけないじゃないか。
タイプ量が増えて疲れる。
86:デフォルトの名無しさん
09/11/29 00:19:27
リエントラントとしてはvoidの方がいい
87:デフォルトの名無しさん
09/11/29 19:43:13
>>76
そんな時代があったことはない。
88:デフォルトの名無しさん
09/11/30 23:48:08
C言語をはじめたばかりであまりわからないのですが、
マウスから酢昆布のような臭いがするんですけど
どうしたらいいですか?
89:デフォルトの名無しさん
09/11/30 23:53:24
あなたにふさわしいマウスです
90:デフォルトの名無しさん
09/11/30 23:55:28
初心者は来るな
91:デフォルトの名無しさん
09/12/23 06:22:56
C言語をはじめたばかりであまりわからないのですが、
手袋にマウスの酢昆布のような臭いが移ったんですけど
どうしたらいいですか?
92:デフォルトの名無しさん
09/12/23 08:46:36
初心者お断り
スレタイくらい読まないか
93:デフォルトの名無しさん
09/12/23 12:56:06
僕もみなさんのようにC言語で自称プログラマーごっこしたいのですが、まず何をすればですか?
94:デフォルトの名無しさん
09/12/23 13:06:10
まずUNIXをハックします
95:デフォルトの名無しさん
09/12/29 17:06:33
C言語をはじめたばかりであまりわからないのですが、
雪も降ってるのに部屋に暖房が無くて寒いんですけど
どうしたらいいですか?
96:デフォルトの名無しさん
09/12/29 17:21:00
CPUをフルパワーで回し続ければ廃熱で温まるYO!
97:デフォルトの名無しさん
09/12/29 21:40:11
int main()
{
}
98:デフォルトの名無しさん
09/12/29 21:42:07
>>96
これを実行するわけだな
int main()
{
while( 1 );
return 0;
}
99:デフォルトの名無しさん
09/12/29 21:45:28
やたー暖房プログラムできたよー
int main()
{
while(1);
}
100:99
09/12/29 21:46:30
ネタ被りサーセン
101:デフォルトの名無しさん
09/12/29 21:51:06
でも最近のマシン速いから無限ループくらいものの数秒で終了するんだろ?
102:デフォルトの名無しさん
09/12/29 21:52:47
終了しないプログラムでも
ソースコードでは戻り値は返さないといけない
103:デフォルトの名無しさん
09/12/30 02:09:08
CPUの消費電力上げるなら、キャッシュとかパイプラインとか
浮動小数点レジスタとか、CPUを出来るだけ全面使った方がいいかも
104:デフォルトの名無しさん
09/12/30 13:03:47
>>102
main()はreturnを省略するとreturn 0;と同値になる。
105:デフォルトの名無しさん
10/01/26 13:58:36
関数へのポインタをprintf系関数で表示させる方法って無いんだな。%pってvoid*だから関数ポインタと互換無いし。
106:デフォルトの名無しさん
10/01/26 14:08:39
intptr_t への変換すら明言されてないんだっけ?
107:デフォルトの名無しさん
10/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;
}
108:デフォルトの名無しさん
10/01/26 22:27:31
このスレでその発言は痛いな
109:デフォルトの名無しさん
10/01/27 09:46:30
107が「普通に void * にキャスト」できる根拠を示せれば問題ないよ!
110:デフォルトの名無しさん
10/01/30 07:38:27
規格準拠専用スレなのに、ほとんどのやつが規格を持ってさえいない…
111:デフォルトの名無しさん
10/01/30 15:56:16
規格票は持っているが規格は持っていない
112:デフォルトの名無しさん
10/02/02 03:45:46
規格書を引用しない奴は出ていけ
113:デフォルトの名無しさん
10/02/02 19:54:27
どの版持ってればいい?
114:デフォルトの名無しさん
10/02/17 20:49:43
C言語をはじめたばかりであまりわからないのですが、
尿をすると時折尿道がズキズキとひどく痛む事があるんですけど
何かの病気でしょうか?
115:デフォルトの名無しさん
10/02/17 21:28:56
P
116:デフォルトの名無しさん
10/02/17 21:51:36
free(penis);
が抜けてるんじゃないかな
117:デフォルトの名無しさん
10/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;
}
118:デフォルトの名無しさん
10/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 の先頭要素である場合に限って安全。
119:デフォルトの名無しさん
10/02/19 02:57:09
>118
素早い回答ありがとうございました
120:デフォルトの名無しさん
10/02/19 07:33:49
「安全」をどういう意味で使っているのか知らないが、
言語規格ではポインタ型のキャストは特定の場合を除いて処理系定義動作。
したがって、
> 以下のような構造体へのポインタのキャストは許されているかどうか
に対する答は「処理系による」
121:118
10/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 の引用文が続くんだけど、キャストが安全かどうかとは関係ないね。
122:デフォルトの名無しさん
10/03/27 14:10:25
C言語をはじめたばかりであまりわからないのですが、
フルートの最低音の C が鳴らせません。
どうしたらいいでしょうか?
123:デフォルトの名無しさん
10/03/27 17:24:45
がんばれ
124:デフォルトの名無しさん
10/04/12 17:03:59
C言語をはじめたばかりであまりわからないのですが、
人生が終わりそうです。
どうしたらいいでしょうか?
125:デフォルトの名無しさん
10/04/12 17:10:31
ビットシフトってなんの役に立つの?
126:デフォルトの名無しさん
10/04/12 17:17:56
goto 人生のスタートライン
>>125
そのコピペを作るのに役に立ってる
127:ノラ
10/04/29 00:08:46
すいませんが教えてほしいことがあります
いま学校の課題で、1+2+3・・・というように加算していき、
加算結果が300を超えたら表示し、処理を終了するプログラムを
作りたいのですが、わかる方いましたら、教えてください。
ちなみにdo-whileで作るのが条件です。
お願いします。
128:デフォルトの名無しさん
10/04/29 00:21:17
>>127
>>1をよく読め
スレリンク(tech板)
こっちでやれ
129:デフォルトの名無しさん
10/05/31 18:23:10
C言語をはじめたばかりであまりわからないのですが、
トイレに行きたいです。
どうしたらいいでしょうか?
130:デフォルトの名無しさん
10/05/31 18:35:03
しばらく我慢するしかないと思う
131:デフォルトの名無しさん
10/05/31 18:43:15
ありがとうございました、我慢します。
132:デフォルトの名無しさん
10/05/31 20:22:33
そろそろ漏れそうなのですが。
133:デフォルトの名無しさん
10/05/31 22:05:51
core dumpとうまく付き合っていかないとダメだからなぁ。
どこまで我慢すべきかもそのうち分かってくると思う。