[表示 : 全て 最新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/


892 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:24:02 ]
>>890
言う

893 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:01:36 ]
せからしか!

894 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:26:22 ]
そうかしら!

895 名前:デフォルトの名無しさん [2007/08/13(月) 05:40:05 ]
なんでこんな流れに?

896 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:41:10 ]
暇な学生が多い
暇な社会人も(もしかしたら普段より)多い(かもしれない)

897 名前:デフォルトの名無しさん [2007/08/13(月) 05:48:12 ]
夏ですな蝉も鳴き始めた時間です

898 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:48:39 ]
お前が上げるからじゃ!

899 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:51:36 ]
さいでした

900 名前:デフォルトの名無しさん [2007/08/13(月) 06:17:36 ]
自演厨通報しますた



901 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 06:28:31 ]
通報しないで|(●)ム(●)| 

902 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 06:29:08 ]
いやんばか

903 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 08:52:03 ]
>>878
> プログラム文を書いてワンボタンでそのプログラムの実行結果が確認できるようなツールがほしいのです.

それは目的ではなく手段だよね。

まず、
試行錯誤的にプログラムを書き換えて、「たまたま」目的の動作をするのを見つけ出す
というのは、やめたほうがいい。かえって遠まわりになる。

次に、
勉強段階の人ほど優秀なコンパイラ&デバッガを使ったほうがいい。
とくにデバッガの優劣は、勉強の効率に非常に大きく効いてくる。

というわけで、VC++を勧める。Express Editionで事足りるかはわからないが。

904 名前:903 mailto:sage [2007/08/13(月) 08:57:55 ]
それからもう一つ。

Webで無料で見られるサイト「だけ」で勉強しようとしているのなら、それは良くない。
良質なサイトはたくさんあるが、それでも、良質な本のほうがずっと優れている。

つまらないところで躓くのは、
・それに必要な知識が抜け落ちている
・間違った知識を取り込んでしまっている
・下手な解説に惑わされている
といったことが原因になりやすい。

本を買うのにはお金がかかるが、
人生の限られた時間を浪費するのに比べたら、
本を買うお金なんて安いものです。

905 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:02:30 ]
ちゃんと勉強できる人にはデバッガは強力なツールになるが、
そういう人はデバッガがなくても自分で工夫して何とかできる。
また、デバッガに頼って結果第一主義になると規格に則った知識が身につかない。

従って、余り勧めない方がいいと私は思う。

906 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:28:13 ]
できる・できない、ではなくて、効率の話なんだけどなぁ。

そりゃぁデバッガなくたってデバッグは可能さ。
でも無駄に労力使うでしょう?

907 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:30:22 ]
少なくとも、この手のスレで、
自分が書いたプログラムがうまく動きません、何が悪いのかサッパリわかりません。教えてください。
なんていうような質問する人は、デバッガでステップ実行すらしてないのよ。


908 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 09:53:08 ]
STL等のテンプレートを使うと、ステップ実行は非常に効率が下がるのだが。


909 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:12:15 ]
だから、デバッガをきちんと役立てることができる人には、わざわざ勧める必要がないんだけどな。
勧められないと使えない人は、きちんと役立てることができないだろうからやはり、勧める必要がないんだ。

910 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:14:06 ]
デバッガがなくても自分で工夫して何とかできる人ほど、デバッガを使うんだなこれが。




911 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:27:42 ]
>>909
そんなことを言っていたら、
自力で習得できない人はプログラミングに向いてないから辞めたほうがいい
ということになってしまうぞ。

スレを見ていると、
デバッガでステップ実行しろ!
と言われて、素直にステップ実行して問題解決している人も、少しはいる。
どんなに能力や素質、やる気があっても、知るチャンスがなければどうにもならない。

残念ながらステップ実行しろと言われても無視しているような馬鹿のほうが多いけどな。

912 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:30:03 ]
>>911
>自力で習得できない人はプログラミングに向いてないから辞めたほうがいい
私の主張したいところはまさしくそこです。

913 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:36:56 ]
>>912
向いてる向いてないに関わらずやらにゃならん状況はあるわけで。

914 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:41:05 ]
そんな香具師にデバッガ渡したら、「偶偶動いたからOK」的なプログラムを量産される羽目になりかねんが。

915 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 14:11:38 ]
それはデバッガ使わないやつこそそうなるだろう。
デバッガに消極的な人は、便利なツールの無い環境でやってんの?

916 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 15:15:39 ]
ステップ実行しない = 意図したとおりのパスを通っているか確認しない
ということなわけで、偶然動いているだけなのを見過ごしてしまいやすい。

917 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 15:18:17 ]
うわぁ、イコールで結んじゃったよ。

918 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 19:42:47 ]
>>916
趣味でのプログラムの話?仕事でのプログラムの話?
趣味のプログラムならPTなんかしないし(ていうかテスト自体しないけど)
仕事のPTでデバッガ使ってやるような個人に頼ったテストはほとんどしない。

まぁPTで通しにくいパスも確かにあるんで、
デバッガ使ってパス確認を全否定するつもりはないけども、
常にソレに頼るようなのはアホだと思うけどね。

919 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 20:14:39 ]
>>918
自分は仕事でも趣味でも、程度の差はあるけれども、書いたコードは1度はステップ実行するよ。
PTではなくCDで。会社によってはCDとPTを一緒にしてCPTと呼んでいるかもしれないが。

趣味だとテストなんてしないに等しいから、なおさら、ステップ実行は大切だよ。


920 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 20:18:41 ]
はいはい



921 名前:878 mailto:sage [2007/08/13(月) 21:12:44 ]
>>903
C++に関してはド素人なんで「初めてのC++」を買って勉強しているんですが,一々100行にも満たないプログラムをコンパイルしてEXEを作って実行とかは煩雑でして...
ちなみにいま使っている開発環境はVC++です。なかなかなれないんで別に使いやすそうなのがあればいいなと思い質問しました。設定次第でステップ実行やワンボタンで実行結果の確認ができるのであれば、このままこれでいこうかとも思ってます。

922 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:28:48 ]
CTRL+F5で実行、質問にyes
でビルド後即実行

これでも面倒ですか?

923 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:32:53 ]
>>921
お前には向いてない
あきらめた方がいい

924 名前:878 mailto:sage [2007/08/13(月) 21:35:30 ]
>>922
そんなんあったんやそれならいけそうです
>>923
うるさい頑張るわ!

925 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:41:04 ]
あほすぎうざい

926 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:49:45 ]
>>924
ちなみにVC++ expressね
起動してからショートカットキーの入力と文字の入力でプログラムプロジェクト作成して
コード入力→ctrl + F5で実行、動作がおかしければF9でブレークポイント設定して
F5でデバッグ実行
と適当にショートカットキー入力してるだけでどんどん作業がすすむ
これで面倒とか言ってたら他のはとてもじゃないけど使いこなせないよ

927 名前:878 mailto:sage [2007/08/13(月) 21:59:37 ]
>>926
うるさいカスタマイズして使うわ!

928 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 22:08:19 ]
>>926
VC++っていろいろ設定いじれるんですね。C++の勉強するまえにそっちの勉強したほうがよさそうです。
今度マニュアル本でも買っていろいろためしてみようと思います。
あと927は私じゃないんで放置しといてください。助言ありがとうございました。

929 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 22:10:45 ]
あほすぎ
VC++先に勉強してあほのお前に分かるわけないやろw

930 名前:デフォルトの名無しさん [2007/08/13(月) 22:20:48 ]
韓国が8/15終戦記念日に2chを潰そうとしています
ソース
cafe.naver.com/makjang212.cafe

日本語訳
vista.jeez.jp/img/vi8700172598.jpg



931 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 06:10:05 ]
で、どうしろと?

932 名前:デフォルトの名無しさん [2007/08/14(火) 21:06:30 ]
質問です。

ソースファイルをまたいでCArrayを使用したいのですが、
どのようにやればいいのかわかりません。

具体的には、片方のソース内でAddして、もう片方のソース内で
使いたいです。

933 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:08:38 ]
説明が面倒なので
extern CArray hoge;

934 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:26:36 ]
>>932
自分がやりたいことくらい、相手にわかるように説明しような。

935 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:32:42 ]
>>932
お前にはムリだ。あきらめろ。

936 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:45:30 ]
>>856
だけど、みなさんのアドバイスにしたがってただ今VC++Exなんたらをインストール中
にしても時間がかかるね。。。

937 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 21:59:54 ]
いちいちそんなこと書くなアホすぎでわろた

938 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:05:20 ]
うるせーばーか

939 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:18:58 ]
殺すぞてめー

940 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:22:15 ]
VC++は初心者にはお勧めできないシロモノですよ。
言語のイロハを学習する前に、ツールの使い方や設定などの前段階で
ワケワカメとなる可能性が非常に高いです。

特に2005のExpressだと、デフォルトではWin32の選択肢が出て来ないという
極悪ぶりですし(すなわち自動的にC/C++ではなく .NET方面へ誘導される)
仮にそこの設定をクリアしたとしても、テンプレートの中身を見てまたまた
目を回す事態にもなるでしょう。

デフォルトでUNICODEの設定フラグが立ってるのも鬼門ですね。
一般的なC/C++の参考書の書式が通用せずに警告が出まくって、これまた
混乱の極み間違いなしです。

sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l

また、この辺の初歩的な関数の取り扱いは、もはやギャグの領域とも思えます。



941 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:23:41 ]
まっアホには使えないってこったな

942 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:28:08 ]
emacsとか使ってmakefileとかjamfile書く方が楽なのか?
俺はそうは思わないけど

943 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 22:41:28 ]
怖いなぁ

944 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:20:03 ]
なにこれVC++って新しいんだな

warning C4996: 'strcpy' が古い形式として宣言されました。


945 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:29:47 ]
944古すぎ

946 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:36:14 ]
>>940
その「一般的な」参考書というのは、「レガシーな」参考書の間違いだろう。
入門者に時代遅れのC標準ライブラリを使わせること自体が間違いだよ。

947 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:46:31 ]
そしてM$と心中するわけですね。

948 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 00:05:45 ]
ちげーよ。
C++のためのステップとしてのCなんて必要ない
ってことさ。

C++ならstrcpyもsprintfも必要ない。

949 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 00:46:56 ]
>>610

遅レスだが

template<typename U>
friend class foo<U>;

ではなく、

friend foo ;

これで、同じテンプレートから作られたものはfriendになる。

950 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 01:50:10 ]
>>940
まずはWindows上でC/C++を勉強するのに薦めたい環境を出せ。

インストーラがパスとかも通してくれるし、
勉強程度ならほとんどの場合、F7押すだけでビルド、
F5押すだけでビルドから実行までしてくれる何が難しいのか。
(2005 EEのビルドはF6だっけ?うちはVS2005SEなんで違った気もする)

C/C++の勉強するのになんでWin32APIが出てくるのかも非常に謎。
Cの標準ライブラリの関数は、警告は出るが「通用する」。

まぁCの導入には俺はVC薦めても良いと思うけど、
一歩進むとC99とか完全に置き去りなのがなぁ・・・



951 名前:12MHz [2007/08/15(水) 09:09:37 ]
Ettercapというツールがありますが、コンソールで動作しているときにメニューを十字キーで
自由に選択できるようになっているのはどのようにして実現しているのですか?

952 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 10:10:50 ]
>>951
Ettercapがどんなツールか知らないけど、
Linuxでコンソールなら、カーソルキーの入力を取って
ncursesか何かで描画してるんじゃない?

953 名前:12MHz [2007/08/15(水) 10:32:33 ]
kaiya.cs.shinshu-u.ac.jp/pub/c/curses/

こういうことでしょうか?

954 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 15:51:01 ]
ユーザへのインタラクティブなエラーメッセージ
ログ等へのエラーの記録

この2つは、

ネストの深い位置(エラーを検出したその場所)
ネストの浅い位置(何かの大きなひとまとまりの処理の結果を受け取る場所)

どちらでやるのが良いのでしょうか。

955 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 20:44:38 ]
好きなほうにしろよ

956 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:05:58 ]
>>955 ・・・好きです

957 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:48:14 ]
そういう意味じゃない

958 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:51:54 ]
じゃあ、どういう意味ですかー!!
私はこんなにも貴方を愛しているっていうのに!!!

959 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:56:12 ]
面白くないよ

960 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:14:27 ]
つまんない奴



961 名前:デフォルトの名無しさん [2007/08/18(土) 22:19:42 ]
>>856 だけど

VC++Exなんたら入れてみたけど、設定多すぎてやる気なくしたんでBCCでやってます。
えっと
異常値が出る問題だけど、ようやく解決しました。
自作のStringクラスの中にポインタをもっていてそこにnewしたメモリを紐づけている
わけですが、引数としてこのStringクラスを渡すとこのクラスのコピーが作られて
もちろんメモリと紐づいたポインタもコピーされて関数の終了とともにdeleteでメモリが
開放されていた。という次第です。
コピーコンストラクタなるものを作ってちゃんとメモリもコピーしてやったら直りました。

おまえら役に立たなさ杉だなwww

962 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 22:23:51 ]
理解できない頭のくせに(笑)

963 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 22:50:01 ]
自作ライブラリの不具合をソース無しで問われてもエスパー以外には回答不可かと

964 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:28:05 ]
>>961
>862で指摘済みじゃん。しかもどんぴしゃ。

965 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:54:19 ]
>>964
それは失礼しました。ご指摘ありがとうございます。

966 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:54:53 ]





















967 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 04:22:05 ]
プログラマー共ってもうすこし同類に優しいと思ってたらそうでもないんだな
殺伐としとる

968 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 04:24:26 ]
優しいよ。どんな戦場に居るんだ?

969 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 08:21:18 ]
>>968
お手手繋いで仲良く微温湯に使っていたいのでしょうよ。
# 微温湯っつーか、泥沼?

970 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 12:39:48 ]
>>961
おまえが馬鹿すぎる。

メンバ変数にポインタを持ち、デストラクタでdeleteしているのに、
浅いコピーをするデフォルト生成のコピーコンストラクタを許す(使う)だなんて。




971 名前:デフォルトの名無しさん [2007/08/19(日) 16:03:05 ]
開発環境
Windows XP SP2
VC++6.0

質問内容
Windowsでmallocを行った際の動作は
 1.OSがヒープ領域をある程度大きく取る。
 2.確保したヒープ領域内からmallocで指定したサイズで領域確保する。
といった2段階の処理が行われている。

という理解でたぶん合っていると思うのですが、現在組んでいるプログラムで、
for( ii = 0 ; ii < hogehoge ; ii++ )
{
・・・
/* 領域確保 */
hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) );
  ・・・
}
といった感じに文字列をメモリに格納する処理があるのですが、一部の処理で以下の現象が発生していて対応方法が見つからずに困っています。
 デバックコンパイル(正常動作) -> 「1」で確保したヒープ領域を使い切った後に、新しいヒープ領域を確保しに行く
 最適化コンパイル(異常動作)  -> 「1」で確保したヒープ領域を使い切る前に、新しいヒープ領域を確保しに行く(見た感じでは99%使われていない)
デバックコンパイルしたモジュールでは正常動作するのですが、最適化コンパイルを行った場合に上記問題が発生して途中で領域確保に失敗してプログラムが止まってしまっています。
メモリの状況をチェックするのには「VM Validator」というソフトウェアを使用しています。

問題点は最適化コンパイルしたモジュールの一部の処理でヒープ領域を無駄に確保しにいくという点です。
mallocは他の場所でもあちこちで使っているのですが、ここの部分でのみ上記現象が発生していて現在苦しんでいるところです
どなたかアドバイスをよろしくおねがいします。

972 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:14:08 ]
エスパー
hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) );
の部分で後からstrcpyで文字列をコピーするんだろうと思うと
hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) + 1 );
じゃないと、終端文字分の'\0'領域がかくほされない

973 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:17:12 ]
>>971
とりあえず、
hogenhoge->hoge[ii] = (char*)malloc( (strlen(line)+1) * sizeof(char) );
に変えてみ。


974 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:18:41 ]
関係ないけど、sizeof(char)はいらんだろ。
sizeof(TCHAR)とかだったら、必然性あるけど。

975 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 16:19:47 ]
それにしても、C++とは思えない酷いコードだな。


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だとわかりきっていても、それを省略すべきではない。







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

前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