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


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

sizeof(char)が必ず1でも、省略すべきではない



1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ]
malloc(sizeof(char)*(strlen(s)+1))
ではなく
malloc(strlen(s)+1)
と書くような糞コードばかり見て育った、
悪しき慣習を引きずった人は引退すべし


101 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 17:50:26 ]
>>94
意味のない議論をしたがる厨房が集まってるだけだろ

102 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 17:54:08 ]
このスレ、すんごい伸びだな。

103 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:01:54 ]
>>84
整数型の暗黙の変換ルールがあるから問題ない。
ただ、size_tは符号無しだから、
intに変換されることで情報が失われるかも分からんね。

104 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:05:52 ]
>>100同感
2バイトあれば全世界の文字が収まると勘違いしていたしな。


105 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:14:57 ]
してません

106 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:22:55 ]
このさい8バイトでいいだろ。

107 名前:デフォルトの名無しさん [2007/08/20(月) 18:23:09 ]
>>100
記号一つに2バイトなんて無意味だし不可能。
strlenが誕生した時代は数バイトのメモリが数万円。

108 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:30:18 ]
んなわけないだろ

109 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:36:58 ]
そんなにsizeof書きたくないんだったら高級言語つかえよ



110 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:40:09 ]
なんじゃそりゃ

111 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:42:46 ]
そんなにsizeof書きたいんだったら高級言語使うなよ

112 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:44:08 ]
>>108
PDP-11は、メモリ64KB程度搭載で、1万ドルくらいだったそうだな。
当時の為替レートからすると、360万円か。

数バイト数万円は違うが、数Kバイト数万円くらいだな。

113 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:44:38 ]
>>111
C言語は高級言語ではないな。

114 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:52:11 ]
>>112
メモリのコストはその一部でしょう

115 名前:デフォルトの名無しさん [2007/08/20(月) 18:53:46 ]
>>1
#defineで定義しておけ。


116 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:54:59 ]
>>114
昔のコンピュータは、メモリのコストは一部なんてもんじゃなく、かなりを占めていたのよ。

117 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:56:14 ]
MSXの32KB増設RAMカートリッジが1万円以上だったのを
思い出したような

118 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 18:58:40 ]
Cができたのってやっとシリコンメモリが普及し始めたころだっけ?

119 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:03:27 ]
>>84
キャストするべき。
size_tがintと同じサイズである保証は全くない。
sizeof(int) == sizeof(long)の環境に限定するなら、省略するのもありかも試練が。



120 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:25:26 ]
C FAQを見てはいけないスレはここですか?

121 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:32:08 ]
>>118
PDP-11の頃

>>120
C FAQは聖典ですか?

122 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 19:40:30 ]
聖典w

123 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 20:38:51 ]
>>121
>C FAQは聖典ですか?
いいえ、常識です。

124 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 20:43:43 ]
>>100
>>107
UTF-16とか思い出してあげてください。

125 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:07:54 ]
>>123
C FAQ では、sizeof(char)を使うのは、プログラムがわかりやすくなるから、一興だと言ってるが?

126 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:10:14 ]
>>124
UTF-16は1文字=2バイトじゃねーよ

127 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:13:15 ]
>>125
ぜんぜんいらねーよ。

とも書いているね。まあどっちも正しいってことだな。

128 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:15:32 ]
書かなかったからといって不正なプログラムというわけではない。

ということだな。

129 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 23:25:35 ]
>>126
小学生からやり直せ



130 名前:デフォルトの名無しさん [2007/08/20(月) 23:37:29 ]
>>129
Cにおいてsizeof(char)=1は仕様だが、
1バイトが8ビットなのは仕様ではない。

131 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:08:16 ]
つまんねー内容をだらだらだらだら
何を言い合ってんのおまえら (w

132 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:19:55 ]
ここの人達が、同じプロジェクトに放り込まれたら、
どうなるんだろう...
C FAQ は理解しやすくなる「かも」とかいてあるけど、
逆に意図が分からなくて困惑する人もいるかも。

133 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:22:53 ]
同じプロジェクトに入ったら個人レベルでソースファイルを分割し
他人が担当しているソースファイルは一切見ないようにすればOK。
レビューとかあれば、同じ信念をもち曲げないメンバーでする。

そんなプロジェクトやだなぁw

134 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 00:44:11 ]
>>130
>>100>>107がC言語の規格が決まった当時の話をしてるのに、
>>124はもっと最近の話をしてるところが突っ込みどころなわけであって。

ナニコレ。
>UTF-16は1文字=2バイトじゃねーよ

>Cにおいてsizeof(char)=1は仕様だが、
>1バイトが8ビットなのは仕様ではない。

誰がUTF-16の1文字=2バイトとか言ってんだ?
んー・・・もしやUTF-16は1バイトが8ビットの環境て使うべきでない、
とかそういう意見をお持ちの方?

135 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 01:57:32 ]
>>134
charは文字だろ

って話の寄り道だったんじゃないか?

136 名前:デフォルトの名無しさん [2007/08/21(火) 07:54:41 ]
マロック・ストラレン

137 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 08:07:00 ]
文字の型を隠蔽してsizeof(TCHAR)でいくね

138 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 10:44:54 ]
>>137
C++ のクラスをWin32とWinCEで使いまわす俺には必須だぜ!

ところで、>>129 がどこに突っ込んでるのかが知りたい。
UTF-16の1文字は2バイトとは限らないし
2オクテットとも限らないわけだが。

139 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:46:27 ]
1バイトのビット数ってこの話にはあんまり関係ないような



140 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:57:51 ]
>>138
根本的にズレてるって意味だろう。
>124 は別にUTF-16が1文字=2バイトだとは言ってないから。

141 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:21:34 ]
>>138
Win32でもUnicodeでやればいいじゃんかー。

142 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 12:33:10 ]
スレの趣旨がわからなくなってきた

143 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 13:37:16 ]
1nibble=4bit

144 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 14:46:42 ]
1nibble=4bit
1byte=8bit
1word=16bit
1dword=32bit
だっけか
環境とか詳しいことは知らんが

145 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 14:59:30 ]
1ワードは36bitだよ。

146 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 15:12:29 ]
1byte=8bitとは限らない。

147 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 15:25:06 ]
32ビット256Kワードとかよくある話だな

148 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 20:46:59 ]
>>142
暇つぶし

149 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 21:40:25 ]
結論。
必ず1だから省略すべし。



150 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 21:53:41 ]
省略するのは最適化コンパイラの仕事であって人間の仕事ではない。

151 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 22:00:31 ]
コンパイラは省略しません。そういう意味では無駄にコストが発生します。
# 勿論、コンパイルのね。

152 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:06:13 ]
>>151
いや、定数の演算だから消えてなくなるだろ

153 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:08:54 ]
もう、どっちなんですか!!!?

154 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:20:24 ]
>>152
消えてなくなると言うことは、コンパイラは省略せずにちゃんと最適化したということですね。

155 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:24:28 ]
意味はあっても価値はない。ってところかしら?
価値が無いからと言って、消して良いのか?
でも最適化でけされるよ。
消されなかったら実行時のコストだな。
じゃあ、今、消しておこう。

156 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:04:18 ]
消してしまったsizeof(char)を復元する必要が出てきたときに
莫大なエネルギーが消費されるからそのままにしておいたほうがいいお。

仕事でスパゲッティコードをリファクタリングしたときに、
元のコードをコメントで残しとけとか言われて非常に苦労した覚えがあるお。

157 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:13:07 ]
>元のコードをコメントで残しとけ
リファクタリングもへったくれもありませんな。

158 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:23:23 ]
>>156
>復元する必要が出て来たとき。
上の方で誰か書いてたけど、ラッパー関数にするか、マクロにするかして、
一度に変えられる様にしておけば良い。
復元してもどうせ1だからそのまま使う訳じゃないだろう。

159 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 09:47:48 ]
>>156
>sizeof(char)を復元する必要
Cの仕様が変更にならない限りその必要は無いからな
どうだろうな



160 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 12:46:00 ]
subversionでいいじゃん

161 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 21:07:24 ]
…そう言って通る職場なら良いけどな

162 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 21:54:59 ]
svn厨は退場してください

163 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 22:36:22 ]
じゃあCVSで・・・ごめん、悪かった

164 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 22:51:41 ]
それならよし!

165 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 23:00:05 ]
それでいいんかい!

166 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 01:40:32 ]
ふつーbzr

167 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 20:54:00 ]
もうねmallocなんてあちこちで書いてちゃだめなんだよ。
ラッパーとか言うのも違うな。
構造化だよ。オブジェクトを作る段でだけ利用するんだ。
そもそもC++の偉い人がnewなんてすばらしい関数を
用意してくれているんだから、new使えよ。

168 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 21:34:07 ]
Dの偉い人が動的配列なんてすばらしい機能を
用意してくれているんだから、動的配列使えよ。

169 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 21:54:16 ]
vector使うお!!



170 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:15:47 ]
え?newって関数なの?演算子かと思ってたんだが・・・

171 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:20:10 ]
C++のnewは演算子だな。


172 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:32:18 ]
newだって寿命管理はプログラマがやらなきゃいけないわけで、
mallocと同じように、
考えて使うところを狭めないと、
収拾が付かなくなる。

173 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:32:33 ]
ってことはoperator newでオーバーロードできたりするの?

174 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:24:37 ]
>>173
何を今更。だからやろうと思えばOS管理外からメモリを引っ張ってくる事だってできる。

175 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:44:33 ]
smart_ptr<T> ptr = Allocator<T>();
みたいなカスタムアロケータ用意するとか

176 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 09:39:31 ]
演算子は全て関数だと乱暴な言い方も当然出来る。

177 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:39:47 ]
>>176
挙動が違うんだけど。

178 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 19:45:47 ]
で、sizeof(char)の省略いいの?わるいの?

179 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 19:48:27 ]
いい



180 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 20:52:42 ]
文法的にも、プログラム的にも、省略するのは間違いではない。
だが、
プログラムを人間が読んで理解する上では、省略しないほうがよい。

181 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 22:22:15 ]
>180みたいな人間に合わせるために、省略しない方がいい。
>180みたいな人間が見ることがないコードなら、遠慮することなく省略していい。

182 名前:デフォルトの名無しさん [2007/08/25(土) 00:29:12 ]
>>180
そもそも理解の妨げにならない、という話をしてるんじゃないのか。

183 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 03:38:00 ]
>>180
逆、コンピューターの作法に人間が合わせてるだけ。
人間様はシンプルな方が理解しやすい。

184 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 09:16:43 ]
>>182
>>180 は理解が足りない、って話じゃないの?

185 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 11:05:48 ]
書く目的が、、、
(1).人間が理解しやすい、と言うなら、
「無くても理解できる。」、「無駄なコードに見える」
(2).char -> wchar_t や処理系固有の文字型に変更する可能性のためなら、
strlen はchar専用、またsizeof(char)と直接書くのも適切ではない。より汎用的に書くべき。
また#if などで、文全体を置き換えるとすれば、(1).より、無くても良い。
必要な型の場合のみ書く。
(3).その処理系はsizeof(char)自体が、1ではない。
このスレの前提「必ず1でも」に一致しないので、除外する。

186 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 13:54:03 ]
>>185
>181

187 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 14:24:25 ]
#define SZCHAR 1

p = (char*)malloc(SZCHAR*strlen(ps));

if(p == NULL)
{
return ERR;
}

こうすればいいじゃね

188 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 14:37:13 ]
>>187
aho


189 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 14:44:33 ]
>>187
βακα..._〆(゚▽゚*)



190 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 15:23:52 ]
>>187
Ma nuke.

191 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 15:29:12 ]
>>185
汎用的に書くからには、それで正しく動作するように書き、テストもすべきだ。
見かけ倒しで実際にはダメなんてのは迷惑。
だから、charでしか正しく動作しないのであれば、charで書いておくべきだ。

192 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 23:38:06 ]
VCならTCHAR使えってこった。

193 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 01:33:34 ]
_TCHARとTCHARの違い、わかって言ってる?

194 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 04:15:18 ]
>>188
気やすくAhoと言うな。

AWKを作った偉い人の名前だぞ。

195 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 05:37:47 ]
/*sizeof(char)*/

196 名前:デフォルトの名無しさん [2007/08/26(日) 14:29:20 ]
なんかchar型のサイズが1バイトって前提の話になってるけど
C++だとcharのサイズって1(単位なし)だよな。
で、各型のサイズはcharのサイズの整数倍であることが保証されている。

でも1=1バイトかどうかは環境依存だよな?
#あくまで企画上の話なので実際にcharのサイズが1バイトじゃない環境出せとかいうのはなしね。


197 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 14:37:23 ]
>>196
1バイトが8ビットであることも決まっていない。
CHAR_BITは8以上となっているから、1バイト=7ビットでは規格合致できないけど。

198 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 14:58:19 ]
>>196
C、C++は 絶対何があってもsizeof(char)は1バイト
と規格で定めてる。
それ以外の環境はありえないし存在しない。

1バイトが8ビットかどうかはこのスレでは論じていない。

199 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 15:02:07 ]
>>197
とりあえず、規格上のサイズ指定に使われている単位と
環境上で実際にサイズ指定に使われている単位って違うよなってことを
指摘したかっただけなんだ。

で、指摘の件だけど、それはcharのサイズ=1=2バイト(今の話なら14ビット)
で定義してやればその要件は満たすんじゃね?
CHAR_BITはcharを構成するビット数であって1バイトを構成するビット数の
話じゃないよな?

あと、バイトの出自ってIBMの内部呼称でbit octetからきてると思ったんだが
今はなんかビット数に関して不問にするみたいなのってあるのかな?



200 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 15:12:09 ]
>>199
そういうこと。外から見てcharが2オクテットだったとしても、
CHAR_BIT == 16にして、sizeof (char) == 1にすれば規格合致できる。

いずれにせよ、198の言うとおりこのスレで話すようなことではないけどな。

201 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 15:47:31 ]
>>198
プログラミング言語C第2版p44(ISBN4-320-02692-6)にはたしかに書いてあるね。
けどプログラミング言語C++第3版(ISBN-4-7561-1895-X)にはそんなこと書いてないよね。
charのサイズに関してはp110で言及してるけど、サイズが1であること、8ビット以上であること、
ほとんどの場合に8ビットバイトであることはかかれてるけど、1バイトとは書いてないよね。
#これよんで9ビットバイトって書いてもいいのかとは確かに思った。

まぁ、何が言いたいかというとcharのサイズが2バイトのC++環境とかだと
sizeof(char)をかけてもC++の仕様レベルで必要バイトサイズとれないよなって話。
#mallocの引数はバイト数なんだよね。

Cは厳密な話知らなかったから知らない。
#ちゃんとC++限定で話してたよね。

>>200
ということで、charのバイトサイズをべつに定義しておいてmallocに渡すときはそれを
使ってバイトサイズに変換しろっていうまとめをするとすれ違いにならないかな?







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

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

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