[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 05/09 17:48 / Filesize : 70 KB / Number-of Response : 365
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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/

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

41 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:03:31 ]
>>40
スレタイ読め

42 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:26:45 ]
>>41
ビットシフトはなんの役に立つのでしょうか
でぐぐれ

43 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:47:50 ]
>>40 ビット単位でシフトしたい時に役に立つ

44 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 15:53:26 ]
>>42
やっぱりこれテンプレにいれとかないとダメだな

45 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 20:16:45 ]
ビットシフトはなんの役に立つのでしょうかでググれ に一致する日本語のページ 約 766 件

46 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 21:02:34 ]
>>34
gcc.gnu.org/c99status.html

47 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:48:40 ]
ふと思ったんだが…

各種処理系のヘッダで NULL が以下のように宣言されているのはなぜ?

#if !defined(__cplusplus)
#define NULL ((void *)0)
#else
#if defined(__LP64__)
#define NULL (0L)
#else
#define NULL 0
#endif /* __LP64__ */
#endif /* !__cplusplus */

つか, C でも (void *)にキャストする必要はないと思われるんだが,
(void*)にキャストしておくとなんかご利益あったりする?


48 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:55:00 ]
int p = NULL; がエラーになる。

49 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:58:48 ]
NULLを'\0'と間違えて使うような馬鹿を摘発したりとか、型チェックの面でご利益がある。



50 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:01:20 ]
#if defined(__LP64__)
#define NULL (0L)

これ処理系依存っぽくて鬱陶しいな

51 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:03:41 ]
処理系自身がそう定義してるのなら
その処理系で大丈夫っつーことだから問題はないだろう

52 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:04:07 ]
>>50
printf の可変長引数対策じゃないか?

53 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:06:36 ]
つーかそういう処理系依存を覆い隠すためにヘッダがあるわけで
ヘッダの定義をのぞき見てあれこれ言っても
このスレ的に意味があるのか疑わしい

54 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:06:54 ]
処理系定義であるポインタのサイズを、NULLの定義の形を借りて記述しているんだよ

55 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:16:17 ]
ポインタのサイズが型ごとに異なったりする処理系もあるんじゃなかった?

56 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:58:41 ]
MS-DOSのミディアムモデルやコンパクトモデルが典型的だな

57 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:18:16 ]
型ごとにというかデータのポインタとコードのポインタのサイズが違う事はあるな
関数ポインタと通常のポインタに互換性がないのはそのため

58 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:51:14 ]
pimpl パターンとか見てる分には
データ同士だとポインタのサイズはかわらないはずだとは思ってるが、
規格のどこに書いてあるかとかは知らんなあ。

59 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:46:52 ]
pimplのどこに異種ポインタの変換が介在するのですかね。



60 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:53:14 ]
スレ違い

61 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:57:46 ]
変換は関係ないだろう。
構造体/クラスの中身が分からなくても
ポインタのサイズが決まるようじゃないと
pimpl パターンは使えないという話だ。

ただ、組み込み型との間でもサイズが等しいかどうかは分からんね。
これだけだと。

62 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 05:15:44 ]
構造体/クラスの宣言(通常はヘッダファイル)があれば型が分かるから
中身見なくてもポインタのサイズは決まると思う

63 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 05:38:48 ]
ポインタのサイズって32bitCPUなら4バイト固定だと思ってた

64 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 10:02:56 ]
Intel + Windows で 16-bit アプリケーションなら 32-bit CPU でも
2 バイトのポインタが使われたりする
が 32-bit アプリケーションならポインタは 4 バイト固定

要するに CPU 依存でなくコンパイラ依存

void* と int* でサイズが違う処理系があるらしいが見てみたいな

65 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:06:04 ]
void* (char*) と int* でアドレッシングが違う処理系があると聞いたが、
それの間違いではなくて?

66 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:11:12 ]
規格ではポインタのサイズはどこまで規定されている?
構造体型を指すポインタのサイズはすべて等しい?

67 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:20:19 ]
処理系依存ってことはつまり、ユーザープログラムより下にあるコンパイラからアーキテクチャから
すべてひっくるめて依存。データ型についてうるさいアーキテクチャもあるかもしれない。
(タグビットでデータ型を指定するような)

仕様では、6.3.2.3 で、任意のデータ型へのポインタから void * へ、
void * にしたものから元の型へ、という変換は保証されることになっている。
(関数へのポインタに関しては規定がない)

整数と任意のポインタ(関数へのポインタ含む)との変換は、処理系定義。
ポインタを入れることができる整数の型として intptr_t(uintptr_t) が 7.18.1.4 に。

68 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:46:07 ]
>>66
> 構造体型を指すポインタのサイズはすべて等しい?
少なくとも、これは処理系によらず保証されている。

69 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:58:44 ]
同サイズの整数型限定だっけ? >整数/ポインタ キャスト
intptr_t はどのポインタと等しいサイズの整数型なんだろう。
それとも、全てのポインタ型のサイズが等しいと保証されているのか?



70 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:00:06 ]
intptr_tはポインタを格納できればいいのであって、
ポインタと同じ大きさである必要は無いだろう。

71 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:04:23 ]
>>69-70
(u)intptr_tに変換できるのはvoid*だけ。

int i = 42;
intptr_t p = (void*)&i;
int j = *(int*)(void*)p;

72 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:39:20 ]
そしてobjectを指すポインタであればどれでも、voidへのポインタに変換後、元に戻せる。
つまり、voidへのポインタのサイズは少なくとも関数ポインタ以外のすべてのポインタ以上。

73 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:06:00 ]
>>71
70に対する反論になっていない

74 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:28:45 ]
反論したつもりはないよ。

75 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:54:06 ]
なるほど。
基本型同士、あるいは基本型と構造体型との間で
ポインタのサイズが違ってても良さそうではあるな。

76 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:16:41 ]
int *とunsigned int*みたいな、指示先型の符号の有無だけが異なる場合、ポインタのサイズは等しい。

77 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:18:39 ]
>>74
じゃあ何で一見関係ありそうで全然関係ない話をしたの?

78 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:33:08 ]
>>77
>>69

79 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:35:13 ]
>>77
何でアンカー間違えただけでそんなに責められないといけないんですか><



80 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 19:59:51 ]
先に「間違えた」と言わないから。

81 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:58:01 ]
>>79
条件の後出しはやめろと。

82 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:19:53 ]
いじめが好きな人達が集まるスレ

83 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:56:02 ]
といいつつ自分の非を棚に挙る人が責められるスレ

84 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:48:59 ]
>>82-83
それはどのスレでもそう

85 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:22:26 ]
ふと気になったんだけど
>50の、0Lをかっこでくくる必要あるの?

86 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:02:18 ]
>>85
#include <stdio.h>

#define HOGE 0L
#define CAT2(a, b) a ## b
#define CAT1(a, b) CAT2(a, b)
#define CAT(a, b) CAT1(a, b)

#define STR2(a) # a
#define STR1(a) STR2(a)
#define STR(a) STR1(a)

int main() {
long double a = CAT(0., HOGE);
printf("%Lf\n", a);
printf("%s\n", STR(CAT(0., HOGE)));
return 0;
}

87 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:43:53 ]
マクロNULLをトークン連結演算子に投げ込むような状況があるとは思えんが

88 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:45:36 ]
そういう問題じゃない

89 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:50:11 ]
あってもこまらないし
あればもしかしたら役に立つかもしれないから

一般的にはある必要はない




90 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:51:38 ]
あってもこまらないし
あればもしかしたら役に立つかもしれないから
とりあえずつけておけ

91 名前:デフォルトの名無しさん [2008/02/19(火) 23:04:55 ]
超カメレスなんだが >>64
ワードアドレッシングのマシンの場合,
ワードアドレス + オフセット
ここで, ワードアドレス == レジスタサイズ
が, バイトポインタになり得ますが…


92 名前:デフォルトの名無しさん [2008/02/20(水) 14:01:41 ]
可変引数型の関数にいくつ引数が入力されたか、
数える方法はありますか?

93 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 14:09:30 ]
標準では、ない

94 名前:92 [2008/02/20(水) 14:44:34 ]
>93
サンクス

95 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:25:37 ]
そう言えばさぁ...
左辺がキャストできなくなったのは C89 からで ok ?
int c; (char)c = 1;
みらいやつ


96 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 02:33:43 ]
*(char *)&c = 1;ならおk
ただしcharは必ず整合するけどもっと大きな型だとむやみなキャストは
境界に整合しなくなるおそれがある

97 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 07:32:26 ]
それはキャストはしてるけど、
キャストした後の値に直接代入してる訳じゃないよね。

98 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:23:07 ]
>>95
というかそれが出来た時期なんかあったのか
どういう処理になるの?

99 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:30:53 ]
>>95
少なくとも現在より前に制定された規格で、
(type)variable を左辺値として認めたものは一つもない。

たしか、gcc, msvcともにラフなモードではコンパイルとおるけど、
結果が違うようになったと思う。



100 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:35:11 ]
ああ、C++で(type)が参照型なのは除く。

101 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:36:16 ]
ちなみにC++だと(char&)c = 1って書ける。

102 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:10:21 ]
>>98
*(char*)c = 1; と同じになった気がする。
K&R C あたりではできると聞いた事があるような気がするが、
詳しい事は俺は知らん。

103 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 20:01:18 ]
K&Rではできた。

104 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:50:20 ]
Cでは符号なし整数をビットシフトすると論理シフト、符号有り整数をビットシフトすると算術シフトになるんですか?

105 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:53:58 ]
右シフトはそのとおり。
左シフトは論理/算術の区別が無い。

106 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:54:59 ]
わかりました。
早いレスありがとうございます。


107 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:55:53 ]
符号あり整数をビットシフトして算術シフトになるかどうかは
C の規格では規定されていない。
ただ、実際問題そういう実装が多いだろうね。

108 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:57:02 ]
unsignedは論理シフトになる
signedが算術シフトになるかどうかは処理系依存

109 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:59:55 ]
規格見直したら、負の数を右シフトしたときは結果の値が処理系定義になるって
書いてあった。つまり、算術シフトとも論理シフトとも違う結果が得られてもおかしくない
わけだ。

あと、型が signed でも値が負じゃなければ unsigned と同じ動作って決められてた。



110 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 03:03:49 ]
2の補数表現じゃない環境だと
算術シフトにならない実装になってるだろうね。

111 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:37:18 ]
ただしどうなるかは(規格準拠の処理系なら)マニュアルに明記されていなければならない

112 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:29:31 ]
明記されていればry

113 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 23:13:23 ]
最近レスが無いので、ビットシフトについて質問してもいいですか?

114 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:24:28 ]
負の数の右シフトが算術シフトになるか論理シフトになるかは処理系依存です。

115 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:29:04 ]
負の数の左シフトは?

116 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:42:31 ]
「場合によって未定義」でいいのかな?
f4.aaa.livedoor.jp/~pointc/105/No.27873.htm
のNo.27888がわかりやすく解説してくれてる。

117 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 02:34:20 ]
>>116
リンク先読んだら、負の数は全部未定義としか読めない。

118 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 06:56:17 ]
The behavior is undefined if the right operand is negative,
or greater than or equal to the length in bits of promoted left operand.

119 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 06:57:38 ]
それはシフト数の方の話だった。



120 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 13:58:33 ]
そろそろビットシフトの質問の出番ですか?

121 名前:デフォルトの名無しさん [2008/04/07(月) 21:51:36 ]
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

122 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 22:33:59 ]
スレ違い

123 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 03:27:19 ]
規格上未定義になってる処理を書いたら例外吐いて止まるコンパイラきぼう

いちいち覚えるの面倒

124 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 10:47:47 ]
ベンダーに言え

125 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 12:31:00 ]
もしさまざまなマシンでどのように実行されるか知らなければ、
知らないということが自分を守る助けとなるかもしれ ない

              from K&R

126 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 00:45:45 ]
例外吐かれるより警告がうれしいな・・・

127 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 20:48:04 ]
エラーでいいよ。
どうせ警告も0にしてるんだし。

128 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:05:24 ]
俺は信号を見ないけど車は俺をよけて通れよ!
なんて高らかに宣言しなくても・・・

129 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:31:25 ]
エラーでも警告でもアラーとでもいいけど、
そこで止まられるのは、、ちょっとやだな。



130 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:49:13 ]
過疎スレ

131 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:07:09 ]
結構前に、アラーメッセージというのがあったな・・・

132 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:31:01 ]
アッラーアクバル!

133 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:00:31 ]
pc11.2ch.net/test/read.cgi/tech/1206196600/637

の件なんですが、こういうことに出くわした場合、
コンパイラはどういう風に振舞わなければならないとなってるのでしょうか?
それとも未定義?

134 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:55:12 ]
>>133
未定義
コンパイラの実装依存です
リンカのオプションでエラーにする設定もおそらくあります

src1.c と src2.c で変数 a の型が違ってたりすると悲惨です

135 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 21:01:07 ]
C の仮定義ってファイルまたぐと適用外だっけ?

136 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:13:29 ]
>>134
未定義と実装依存は違うし、そもそもコンパイラにとっては正しいソース
なので、

> コンパイラはどういう風に振舞わなければならないとなってるのでしょうか?

普通に振舞うだけ。

大抵の環境ではリンカでエラーになるはず。
(そのスレでは、エラーにならないと言い張ってるが。)

137 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:19:34 ]
>>136
未定義なので実装依存と書けばいいの?
gcc なら警告無し
borland C++ compiler なら警告あり

大抵の環境って何が基準?

138 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:30:12 ]
VC++2008でも警告無しだな

139 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:31:34 ]
みんなあんまり適当な事言うなよ?

>>133
あまり知られていないが、これは 「仮定義(tentative definition)」 という仕様。
extern も static もついていない、初期化を伴わないグローバル変数の宣言は 「仮定義」 と見なされる。
対する、extern も static もついていない、初期化を伴うグローバル変数の宣言は 「外部定義(external definition)」 と見なされる。

外部定義は必ず実体定義を伴う。
外部定義が複数あると、二重定義となりエラーとなる。

しかし、仮定義は他に実体定義がなければ実体を定義し、
他に実体定義があれば実体定義を伴わない単なる宣言と見なされる。
複数の仮定義を書いた場合、実体は1つだけ定義され、それらの仮定義は実体を共有する。

つまり、>>133 は仕様。



140 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:35:35 ]
ちなみにこの仕様は C++ で廃止された。
C++ では仮定義がなくなり、
extern も static もついていない、初期化を伴わないグローバル変数の宣言も
外部定義と見なされ、実体定義を伴う。

このあたりの違いの話は C++ の規格の付録に書いてある。

141 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:14:40 ]
>>137
> 未定義なので実装依存と書けばいいの?

違う。

未定義は何が起っても文句を言うなと言うこと。
(実行したらPCが壊れるような実行ファイルを生成しても規格には違反しない。)

実装依存は何が起るかは環境によって違うけど、環境毎に何が起るかは決まってい
ると言うこと。

>>137, >>139-140
すまん、仮定義のことすっかり忘れてた。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<70KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef