[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 04/25 21:15 / Filesize : 282 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

スレを勃てるまでもないC/C++の質問はここで 2



1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/


976 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:21:00 ]
>>974
いる。

あとでcharをTCHARに変えることもある。
そのときに+1なんてのはマジックナンバーになってしまう。

977 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:24:22 ]
>>976
だったら最初からTCHARにしとけばいいじゃん。
なんのためのジェネリックテキストだよ。

978 名前:971 [2007/08/19(日) 17:49:31 ]
うぉっ直りました^^;
デバック版でたまたま動いてたのはヒープ領域確保する際に初期化とかしてるのが最適化版だとしてくれないとかがあって、異なる結果になってたのかな・・・

>>975
ひどいコードですみませんorz
実のところ、掲示板に書いたコードはmallocをfor文で繰り返している部分ってのを表現したくて、その場で書いたコードだったのですが、元のコードでも指摘されたのと同じミスをしていました・・・
しかも今見なおすとforループのhogehogeと領域確保する構造体の名前がかぶっている・・・と思ったら片方はhogeとhogeの間にnが入っている・・・う〜ん質問するに当たってこんなコードのせてちゃダメですね

>>974
sizeof(char)はcharが1バイトではない処理系がもしかしたらあるかもしれないので、そういう意味でこうしてます。
TCHARってのは使ったことないのですが、charとは違った文字列の持ち方をするってことかな?
勉強してみますね^^

皆さんアドバイスありがとうございました。

979 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 17:53:35 ]
>>978
charはかならず1バイト。

980 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:43:16 ]
>>978
うつろな記憶なんで、嘘だったら誰かフォロー頼む。

デバッグビルドだとデバッグのための領域が一緒に確保される。
なので、バッファオーバーフローしても、デバッグのため領域を食いつぶして
正常に動いてるように見えることが多い。

リリースビルドだと、余分な領域を確保しないので、
オーバーフローするとわけの分からない動きをする可能性が高い。

とかそんな話だったと思う。

981 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:48:18 ]
>>977
TCHARとして書いていないものをTCHARとして書くのは無責任だ。

だいたい意味が分かるように書くべきであって、
型のサイズが既知で変りそうもないからハードコーディングするのはおかしい。
sizeof(DWORD)なんてのも直に4と書けと言うのか?

982 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:58:11 ]
>>978
TCHARというのはWindowsのWin32APIのマクロで、
Win32APIのUnicode版とMCBS版を透過的に使うためのもの。
実体は、

#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef unsigned char TCHAR;
#endif

こういうことになってる。

ちなみにVC++のランタイムライブラリでは、
#ifdef _UNICODE
typedef wchar_t _TCHAR;
#else
typedef char _TCHAR;
#endif
ということになっている。

この2つは厳密には別物であり使い分けるべきなのだけれども、
Win32APIと関係のないところで_TCHARではなくTCHARを使う人が少なくない。

983 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:02:24 ]
>>980
デバッグビルドの場合、バッファオーバーフローを検出するための仕掛けがある。

MSDNライブラリ等で
_CrtCheckMemory
などの一連の項目を見るといい。

簡単に言うと、余分にメモリを確保して、そこに特別な値を書き込んでおき、
その値が変っているかどうかをチェックして、バッファオーバーフローを検出する。
VC++6.0のIDE上でデバッグモードで動かしていれば、
プロセスが終了する間際に、トレースの所に何かメッセージが出ていたと思うよ。

984 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:05:48 ]
>>981
もちろんほかの箇所もTCAHR使うって前提だよ。
>>976 の「あとでsizeof(TCHAR)にすることもある」って話も、そこだけ変えるんじゃないだろ?

ハードコーディングしろって話じゃなくて、sizeof(char)は1だと決まってるんだから、そもそも、いらないって話だよ。
あとでsizeof(TCHAR)に書き直すくらいなら、最初からそう書いておけばいい。








985 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:17:14 ]
>>984
ただ単に
1
と書いたら、意味がわかりにくい。

もう一度聞くが、
sizeof(DWORD)も4と書くのか?


986 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:18:26 ]
誰が1や4と書くなんて書いとんねん
つまらない事で言い合いスンナ!

987 名前:971 [2007/08/19(日) 19:19:18 ]
>>980
おお〜なんか納得できる^^

sizeof(char)に関しては、>>981さんの考え方に近いかな〜
昔32bit -> 64bitの移植に携わったことがあって、その時にちと苦しめられたので明示的に書くようにしてます^^
具体的にはポインタの領域確保するのに、(たぶん組んだ人は動きゃいいやという考え方で適当に組んでいたダメ人間)sizeof(int)使って領域確保してて、
32bitだとポインタもintも両方同じ4バイトだからちゃんと動作するんだけど、
64bitではポインタだけ8バイトに変わるから、そこの部分でエラーが出て、
しかもコピーして使いまわしたらしく同じようなコードがあちこちに点在してて・・・

今となってはいい思い出だけど、あれは大変だったなぁ〜(-_-;)
今回のケースとは大分違うんだけど、明示的に書いておいた方が将来的にどんなふうに仕様が変化するか分からないし安全だなぁ〜って教訓からこうしてます^^


988 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:25:16 ]
TCHARも知らん分際で何ホザいとんねん

989 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:27:16 ]
>>985
だから「いらない」って言ってるじゃん。

malloc(strlen(s) * 1) こんな書き方しろなんて言ってないよ。

990 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:30:02 ]
>>987
intとcharは、事情が違うよ。

991 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:39:00 ]
もうスレが終わりそうだからマトメ

(a) malloc(tcslen(s) * sizeof(TCHAR)) なら普通の書き方。

(b) malloc(strlen(s) * sizeof(char)) のsizeof(char)は意味がない。

あとでcharをTCHARに変えるかもって想定してるなら、この使い方はマジックナンバーを
埋め込んでるより多少はマシだけど、まあ大差ないレベル。
最初から (a)の書き方をするべき。


992 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:42:26 ]
>>989
malloc(strlen(s)+1)
こんな書き方をしたら、気持ち悪いだろ。

mallocが受け取るのは「文字数」ではなく「バイト数」だ。
strlenが返すのは「バイト数」ではなく「文字数」だ。それは+1しても、「文字数」のままだ。
「バイト数」を受け取るところに、「文字数」を渡すのは、気持ち悪すぎる。

sizeof(char)に「文字数」を掛けることで、適切に「文字数」を「バイト数」に変換できる。
だから、たとえsizeof(char)が1だとわかりきっていても、それを省略すべきではない。


993 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:43:53 ]
>>991
99%の確率でバグっているコードを「普通の書き方」なんて言うな。

994 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:48:17 ]
>sizeof(char)に「文字数」を掛けることで、適切に「文字数」を「バイト数」に変換できる。
いいえ。



995 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:48:32 ]
ツマンネェ奴ら

996 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:49:00 ]
>>977>>974 でしょ?
元もとstrlenだけで十分だと言ってるんだと思うが...
もし、つけるんだったらsizeof(*line) じゃだめか?

997 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:52:37 ]
>>993
元のコードにあわせただけ。
この話の本筋とは関係ないし。

マイナーな本でsizeof(char)を使えって薦めてるのを見たことあるけど、
まあ、こういうスタイルは、圧倒的に少数派。
こんなクセのある書き方を推奨するやつは、コードを読んで無さ杉。

998 名前:971 [2007/08/19(日) 19:54:19 ]
なんかスレが荒れてしまって申し訳ないです。

皆さん善意で書き込んでくださっているわけなので、感謝してます。
ただ個々人で使用し続けてきたコーディングのスタイルがあって、それでいい争いになってしまっていて、すれが険悪になってしまって申し訳ありません。

今回の件ではバグが取れたという以外にも、文字列絡みの処理に対して再勉強する機会になったのでよかったです。


999 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:55:25 ]
↓1000

1000 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:02:37 ]
呼んだ?

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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