1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ] malloc(sizeof(char)*(strlen(s)+1)) ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
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に渡すときはそれを 使ってバイトサイズに変換しろっていうまとめをするとすれ違いにならないかな?
202 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 15:48:12 ] マルチバイトを扱うなら文字列関係は普通ライブラリ化する 不都合が発生してもそこだけ修正するので1の件は重要じゃない 反対にmalloc散らばりまくりの汚い実装なら 17文字余計にタイプすると人件費にして2円位になるから わざわざ強要してもとコストがかさむだけでメリットがない
203 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 15:50:25 ] >>202 >17文字余計にタイプすると人件費にして2円位になるから 計算方法kwsk
204 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 15:56:25 ] >>201 wikipediaでもなんでも見ればいいだろ。
205 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:07:59 ] >>203 例えば1500円/人時で5秒2円位。17文字タイプだとその位にはなる
206 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:14:51 ] >>201 ISO/IEC 14882(C++の規格だ) の5.3.3 Sizeof にこう書いてある。 sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;
207 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:20:56 ] >>206 いや、お前さんは流れ読めてなさ杉だろ。
208 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:21:29 ] #define sizeof(char) 1
209 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:24:36 ] >>207 >charのサイズが2バイトのC++環境とかだと っていう>>201 の前提がこれで無くなった っていうだけだよ
210 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:25:29 ] >>201 後半 それはない。 そうだとすると、malloc(2)の返すポインタが 要素数2つのchar配列として使えないという意味になるではないか。 mallocが使う単位もまた、sizeofと同じ。
211 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:36:14 ] >>209 sizeofの単位がバイトとはどこにも書いてないだろう
212 名前:201 mailto:sage [2007/08/26(日) 16:36:27 ] >>209 いやいや。だから、規格だと1とは書いてあるけどそれが1バイトを意味するって書いてないよねってはなし。 たとえば1=1ワードとかあり得るわけで。昔とかだと1ワード9ビットとか10ビットのマシンってあったしね。 その1ってなんだ? っていうお話。 sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; じゃなくて、 sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1 byte; ってかいてあるなら自分の言ってることは間違いってことになるけど。 >>210 そうだよ。だから、規格上ではホントにそれが保証できないって言いたいわけ。 malloc(8)の返すポインタが要素数2つのint配列として使えないのと同じってこと。 mallocが使う単位はbyteでsizeofの単位はC++に限って言うならcharのサイズを1とした環境依存。 実用上同じでないと使い勝手が悪いというのならそれには同意。
213 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:43:08 ] C99ではsizeofの結果はバイト数ってことになってるな。 > sizeof 演算子の結果は、そのオペランドの大きさ(バイト数)とする。
214 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:44:00 ] >>212 The sizeof operator yields the number of bytes in the object representation of its operand. ってわけえ、sizeofはバイト数を返します
215 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:46:07 ] >>201 次のネタどうぞ
216 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:51:06 ] sizeof()の返り値はバイト数 malloc()の引数はバイト数 では、 strlen()の返り値は何? バイト数なら、そのまま+1してmallocの引数に渡すのはOKだが、 文字数なら、sizeof(char)を掛けないと、バイト数にはならないよね。
217 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:56:47 ] The strlen function returns the number of characters that precede the terminating null character.
218 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:00:44 ] 1を掛けても掛けなくても数値は変わらないよね
219 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:03:15 ] strlenの引数は char* だから文字数=バイト数と考えてよいのでは? それとも漢字が混じるとそれも1文字として扱われるだろうか? だとしたら、sizeof(char)掛けてもバイト数にはならないよね。
220 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:03:27 ] >>216 戻り値はキャラクタ数 1キャラクタは1バイト よって戻り値はバイト数 ってことだね
221 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:05:29 ] それは数値の一致であって、意味の一致ではない。 あくまでも「1バイト文字」の「文字数」なのだから。 省略してもプログラムは意図した通りに動くが、 プログラムが動けば何だっていいというのは間違い。
222 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:15:13 ] 仕様上キャラクタ=バイトです。 たまたま文字を意味するときだけ わかりやすくキャラクタと表記します。 そのため、byte という型はありません。 だってさ。なるほどね。
223 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:19:42 ] ?
224 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:17:13 ] >>221 1バイト文字の文字数がバイト数と等しいと見なすことの何がいけない。
225 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:25:17 ] プログラムのコードに現われない、暗黙の変換を行うから、いけない。
226 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:26:25 ] >>225 暗黙じゃないだろ・・・
227 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:34:00 ] >>225 こんな自明な事柄、変換じゃないだろ。
228 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:42:37 ] 自明だからといって省略するのは、悪い癖だなぁ。
229 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:57:07 ] そもそも変換じゃないだろ。
230 名前:201 mailto:sage [2007/08/26(日) 19:23:37 ] >>213 >>214 これは知りませんでした。ご教授ありがとうございます。 たしかにsizeof(char)は常に1で、返すのはバイトサイズだからcharが 2バイトの環境ってあり得ないですね。 勘違いしてました。 >>215 ごめん。 俺の疑問は俺の誤解だったということで解決したから、次のネタはないの。。。 単発と言うことで許して。
231 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:09:02 ] お前ら、こんな下らない話で、よくここまでスレを伸ばしたなぁ。 いまどきmallocとstrlenを散在させるようなコードを書くほうがオカシイ。 strlenなんて使うか? ふつー。
232 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:14:17 ] 最近はもうC自体あんまり使わない
233 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:23:27 ] >>231 話がループしてるからいくらでも伸びる気がする。 ところで、 「散在させる」ってのはどこから出てきた? strlenを使わないなら何を使う?(あくまでCだとして) sizeof(char)を省略すべきでない?
234 名前:!= 231 mailto:sage [2007/08/27(月) 01:25:34 ] ここでstrlen_sだなんて言ってみるテスト
235 名前:デフォルトの名無しさん [2007/08/27(月) 01:28:31 ] >>231 くだらないからこそだろう まさにこれこそが 「自転車置場の議論」 ってやつだな
236 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:35:19 ] >>233 マクロ、ライブラリ、クラスの中で使うのではなく、 ベタベタと書くコードの中で使う = 散在させる ぶっちゃけ、適切に局在化されていれば、 多少マズいコードだろうと直せるので、 このスレで話しているようなことは、 どーでもよくなるんですよ。
237 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:39:54 ] そうだ、マルチバイト文字が存在するからいけないんだ! 今日から、みんな、英語で生活! それで全員ハッピーだ!
238 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:57:57 ] Die job death car?
239 名前:233 mailto:sage [2007/08/27(月) 02:01:15 ] >>236 「散在させる」はスレの流れから読み取ったわけじゃないのね。 俺も同じ考えだけど、ちょっと論点がずれてる気がする。 「局在化」とか、「直せる」とかはこのスレには関係ないな。 局在化したその場所で「省略するかしないか」ってことが問われてる。 まあ、そこで、「どーでもよい」ってのが答えなんだろうけど。
240 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 04:21:09 ] ここで新たな判断基準を持ち込んでみる。 どちらが適切だと思うか主張する場合に、年収も書くこと。 年収の多い人のやり方が、すなわち、より成功に近い。
241 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 06:00:54 ] 馬鹿発生
242 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:04:13 ] アホが来たよ・・・
243 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:28:33 ] >>231 C言語なら「普通」strlenを使うと思う。 NULL終端までのバイト数を取得する関数なんて作るのは、 まぁライブラリの標準関数が使えないプロジェクトぐらいじゃないの?
244 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 11:19:52 ] 今時charの内部形式を意識しないといけない言語は使うな。
245 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:17:20 ] >>243 何かにつけてstrlenする、糞遅くて信頼性の低いプログラム書いてるのか。ご苦労さまです。
246 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:20:17 ] 本当、何かにつけてstrlenの必要に迫られるCは疲れるよ。
247 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:25:11 ] >>245 C厨だがそこには同意
248 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:18:47 ] strlen
249 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:23:02 ] struct { size_t bufferLen ; size_t validLen ; char szBuffer[1] ; } ; とかの構造体を使って、バッファの長さや有効長を管理したらいいじゃないか。 szBuffer[1]と言いながら、実際にはヒープから長い領域を貰うのは気持ちわるいかもしれないが。
250 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:36:12 ] >>245 自分がそうだからといって人もそうだとは限りません。 間抜けですね。
251 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 18:10:40 ] >>249 そこまでするくらいならC++使う。そもそも使えるときは使っている。
252 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 19:11:38 ] >>250 どんなコードを書いているのか披露してほしい。お手本にするから。