★初心者にVisual C++を教えるスレ★ Part38
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/11/03(木) 00:54:48.61お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。
■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう、特にWindowsForm、MFC、Win32アプリケーションの区別。
・できるだけ具体的に。
質問の仕方については次のページが大変参考になります。
http://www.hyuki.com/writing/techask.html
■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
(MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。
【過去スレ】
Part37 http://hibari.2ch.net/test/read.cgi/tech/1299982561/
Part36 ttp://hibari.2ch.net/test/read.cgi/tech/1273939582/
Part35 ttp://pc12.2ch.net/test/read.cgi/tech/1256645713/
Part34 ttp://pc12.2ch.net/test/read.cgi/tech/1245382769/
Part33 ttp://pc12.2ch.net/test/read.cgi/tech/1235292263/
0538デフォルトの名無しさん
2012/09/25(火) 23:44:32.53やっぱり普通に言語の勉強するよりも動かしたほうがいいんですね
0539デフォルトの名無しさん
2012/09/26(水) 08:21:09.71って書き方してるソースも見たことあるわ
0540デフォルトの名無しさん
2012/09/26(水) 13:29:08.57そのポインタの値がNULLかどうかチェックする必要はありますか?
具体的には、
try{
do something;
}
catch(char *hoge){
printf("received exception: %s", hoge);
}
としたい場合、
catch(char *hoge){
if(hoge){
printf("received exception: %s", hoge);
}
}
と書くべきかどうかです。
この場合は throw してる側で hoge が動的か静的かで違うと思いますが、
動的に hoge が生成されるような場合についてです。
0541デフォルトの名無しさん
2012/09/26(水) 13:31:52.59誤 received exception
正 caught exception
0542デフォルトの名無しさん
2012/09/26(水) 13:55:26.100543デフォルトの名無しさん
2012/09/26(水) 14:03:10.45既に別の例外が発生しているか
強制終了されている状況じゃないかな
0544デフォルトの名無しさん
2012/09/26(水) 14:45:04.26それよりお前
delete hoge;
し忘れてるぞ
0545デフォルトの名無しさん
2012/09/26(水) 21:26:41.46>>540
それって状況によるかも知れないから、どうしても心配ならこんな風に書いたりすることもある。
まあこれもどうでもいいかもしれんが。
printf("received exception: %s", hoge == NULL ? "NULL" : hoge );
0546デフォルトの名無しさん
2012/09/26(水) 23:34:50.18http://msdn.microsoft.com/ja-jp/library/9yb4317s.aspx
に書かれている通り行ったのですが、試しに sizeof(void*) を出力させたところ 4 となりました
これは通常だと8となるはずなのですがどうなのでしょう
0547デフォルトの名無しさん
2012/09/26(水) 23:58:08.730548デフォルトの名無しさん
2012/09/26(水) 23:59:56.26どうやって設定するのですか
0549デフォルトの名無しさん
2012/09/27(木) 09:59:33.250550デフォルトの名無しさん
2012/09/28(金) 19:51:36.48ありがとう
0551デフォルトの名無しさん
2012/09/29(土) 10:04:12.90VisualStudio 2010 で C++ を使い、Win32 アプリを作っています。
アプリ実行時に、IDE 上に任意のログを出力する機能ってありますでしょうか?
やりたいのは、Eclipse / Android 開発で、Log.e を Logcat で捕まえるようなものです。
リアルタイムで実行状況を確認したいときに使いたいです。
0552デフォルトの名無しさん
2012/09/29(土) 10:17:37.470553551
2012/09/29(土) 10:47:50.910554デフォルトの名無しさん
2012/10/01(月) 02:46:20.20Vistaや7のAeroのGUIで、ボタンにカーソルを合わせると徐々に青っぽくなって
カーソルをはずすと、また元に戻っていくようなアニメーションっぽいのを
やりたいんですが、この処理は自分でタイマー使ってやる以外に方法はありますか?
0555デフォルトの名無しさん
2012/10/01(月) 04:51:11.160556デフォルトの名無しさん
2012/10/05(金) 12:04:40.080557片山博文MZボット ◆0lBZNi.Q7evd
2012/10/05(金) 16:16:50.27printf("%.*s\n", 4, "TESTTEST"); // TESTと表示。
0558デフォルトの名無しさん
2012/10/05(金) 19:29:48.17やさしさ乙
0559デフォルトの名無しさん
2012/10/05(金) 20:13:25.320560デフォルトの名無しさん
2012/10/05(金) 20:17:05.380561デフォルトの名無しさん
2012/10/05(金) 20:37:52.16hogehoge;
}
これだとバグ出るよね
0562デフォルトの名無しさん
2012/10/05(金) 21:19:10.75sizeof(buffer) / sizeof(buffer[0])かポインタでなければ_countof(buffer)がいい
0563デフォルトの名無しさん
2012/10/06(土) 16:03:54.56これって buffer が配列じゃなくてポインタのときは駄目じゃない?
0564デフォルトの名無しさん
2012/10/06(土) 16:48:03.890565デフォルトの名無しさん
2012/10/06(土) 16:52:19.50printf("%d", _countof(buffer));
0566デフォルトの名無しさん
2012/10/06(土) 16:58:29.23ちゃんとコンパイルエラーになるから大丈夫
0567デフォルトの名無しさん
2012/10/06(土) 17:14:27.83○ sizeof(buffer) / sizeof(buffer[0])
○ _countof(buffer)
char *buffer = (char*)malloc(sizeof(char) * N);
× sizeof(buffer) / sizeof(buffer[0])
× _countof(buffer)
○ int size = sizeof(char) * N;
0568デフォルトの名無しさん
2012/10/06(土) 17:17:14.26コンパイルエラー出すための仕組みなんか
誤解してたわ
0569デフォルトの名無しさん
2012/10/06(土) 17:25:52.36× sizeof(buffer) / sizeof(buffer[0]) // コンパイルエラーにならなくて実行時誤動作
× _countof(buffer) // コンパイルエラーになるから大丈夫
0570デフォルトの名無しさん
2012/10/07(日) 01:23:43.90次のエラーが解決できず、かなり苦労しています
LINK : fatal error LNK1104: ファイル 'glut32.lib' を開くことができません。
調べてでてきた
・glut32.dllを"C:\Windows\System32"に入れる
・glut32.dllを"〜〜.vcproj"と同じフォルダに入れる
・プロジェクト→既存項目を追加→glut32.dllを選択
をすべて試してみたのですが、エラーが消えません・・・
環境はVisual C++ 2008、Windows7の64bit、プロジェクト自体は"Win32"です。
どうかよろしくお願いします・・・
0571デフォルトの名無しさん
2012/10/07(日) 01:56:52.250572デフォルトの名無しさん
2012/10/07(日) 01:59:53.670573デフォルトの名無しさん
2012/10/07(日) 02:05:55.88/ / バカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ 馬鹿には無理
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
0574デフォルトの名無しさん
2012/10/07(日) 02:49:45.32>>572
glut32.libがあるディレクトリを含めていませんでした!!
ありがとうございます、無事にコンパイルが通りました!!
0575デフォルトの名無しさん
2012/10/07(日) 12:03:00.670576デフォルトの名無しさん
2012/10/07(日) 15:19:15.62「遊ぼう」って言う。
「もう遊ばない」って言うと
「ごめんね」って言う。
そうして、あとでかわいそうになって
「遊ぼう」って言うと
「もう遊ばない」って言う。
こだまでしょうか?
いいえ、馬鹿には無理です。
0577デフォルトの名無しさん
2012/10/07(日) 15:57:37.450578デフォルトの名無しさん
2012/10/07(日) 16:36:41.54Cでコンパイルしたときと
C++でコンパイルしたときとでは
出来上がるプログラムのサイズは変わりますか?
0579デフォルトの名無しさん
2012/10/07(日) 16:52:07.070580デフォルトの名無しさん
2012/10/07(日) 17:55:47.96リンケージの名前のつけかた違うからちょっとは違うだろうけど、、
0581デフォルトの名無しさん
2012/10/07(日) 17:59:07.250582デフォルトの名無しさん
2012/10/07(日) 20:06:38.430583デフォルトの名無しさん
2012/10/07(日) 20:52:56.230584デフォルトの名無しさん
2012/10/07(日) 23:01:33.290585デフォルトの名無しさん
2012/10/08(月) 18:24:19.310586デフォルトの名無しさん
2012/10/10(水) 13:43:23.50いくつかのサイトを見ても解決しなかった疑問があるので教えてください。
配列として new したポインタの delete について、
あるサイトでは、
>重要なのはdelete演算子の使い方です。
>new演算子を使って配列を確保した場合、delete演算子にも[]を付けなけ ればなりません。
>これを付けないと、正しく解放できません
>(恐らく、配列の先頭の要素についてだけ解放されるが、 それすらも保証されている訳ではない)。
>この[]の付け忘れは非常によくある間違いです。コンパイルは普通に成功 してしまうので気をつけて下さい。
と書かれていました。
一応言われている意味は判るのですが、なぜ [] を付けると「正しく解放できる」のかが判りません。
たとえば、内部で int *p = new int[n]; した int *p を返す関数 Hoge があるとします。
int *Hoge(size_t n){
int *p = new int[n];
return p;
}
これを main 側で受け取って delete[] するケースですが、
int *q = Hoge(N);
delete [] q;
と書くのが正常である。ということになると思いますが、
delete q; だと先頭の 1 要素だけ削除され(るかもしれない)、
delete [] q; だと N 個の要素が削除されるという意味になると思うのですが、
そもそもここで q のサイズを把握することはコンパイラには可能なのでしょうか?
実行時にしか決まらないと思います。
delete [N] q; と書くべきですよね?(書けないけど)
0587デフォルトの名無しさん
2012/10/10(水) 13:46:18.40int *q = Hoge(N);
delete [] q;
で、正しく N 個の要素を削除出来る仕組みが(確保されたオブジェクトの方とかに)あるのなら、
そもそも、
delete q;
と書いても大丈夫のような気がするのです。
0588デフォルトの名無しさん
2012/10/10(水) 13:47:13.04よろしくお願いします。
0589デフォルトの名無しさん
2012/10/10(水) 13:49:58.26試して味噌
0590デフォルトの名無しさん
2012/10/10(水) 13:50:28.580591デフォルトの名無しさん
2012/10/10(水) 13:51:41.94それは判るんです。
疑問点は [] があるときは要素数がなぜ判るのか?って所です。
0592デフォルトの名無しさん
2012/10/10(水) 13:55:23.89ほんとの疑問点は、配列だとわかってるくせに
なぜ [] を指定しないとちゃんと呼んでくれないの?
じゃないのか?
0593デフォルトの名無しさん
2012/10/10(水) 13:56:55.44するとp[-3]あたりに確保した要素数が入ってあったり
0594デフォルトの名無しさん
2012/10/10(水) 13:59:54.45やってみます。
>>593
それが出来るなら、delete p; でも良いような気がしてるんです。
0595デフォルトの名無しさん
2012/10/10(水) 14:01:41.880596デフォルトの名無しさん
2012/10/10(水) 14:01:46.27>>593
あと、sizeof(p) とかは動的な場合は取れない(コンパイルエラー?)ですが、
「本当は判る。」ってことになりますよね?
0597デフォルトの名無しさん
2012/10/10(水) 14:02:32.11じゃあ一個だけ消したいときはどうすんの?
0598デフォルトの名無しさん
2012/10/10(水) 14:03:46.08>>595
ああ、
free だと p[-3] を使って常に全部解放されるけど、
delete だと p[-3] は見なくて、
delete [] のときだけ、p[-3] を見るってことですか。
0599デフォルトの名無しさん
2012/10/10(水) 14:04:49.35それはもちろん、
delete p[0];
とかで可能ではないですか?
0600デフォルトの名無しさん
2012/10/10(水) 14:09:19.96それに気付いた禿が delete [] を追加した。
0601デフォルトの名無しさん
2012/10/10(水) 14:19:21.28VC++ 2008 Express でアセンブラ出力してみましたが、
delete q; も delete [] q; も同じコードが吐かれてますね。・・・ orz
0602デフォルトの名無しさん
2012/10/10(水) 14:38:30.96さっきのは最適化されてたのだろうか。・・・ orz
0603デフォルトの名無しさん
2012/10/10(水) 14:41:25.060604デフォルトの名無しさん
2012/10/10(水) 14:43:43.18確かにそうなってますね。
そもそも、 delete で配列全部のデストラクタ呼べば良いのに、
(個別の要素を消したければ、 delete p[] で可能。)
なんでわざわざこんな変な仕様にしたんだろ。
間違いコード誘発しまくりですよね。
0605デフォルトの名無しさん
2012/10/10(水) 14:54:38.31*(size_t *)((unsigned char *)&p[0] - 4)
で参照したら確保した要素数と同じ数が取れました。
本当にありがとうございました。
0606デフォルトの名無しさん
2012/10/10(水) 14:57:41.96>>600
>>605
それ64bitだと動かなくなるよ
0607デフォルトの名無しさん
2012/10/10(水) 15:03:42.61禿も言ってるようにvector使え
そもそもdelete &p[n]で個別の要素が消せるとして何が嬉しいんだ
配列の要素を消したら最後forで処理できなくなるだろうに
0608デフォルトの名無しさん
2012/10/10(水) 15:20:09.52それはどうでもいいんです。
delete と delete [] の使い分けがどうして必要なのかなと思ったので。
0609デフォルトの名無しさん
2012/10/10(水) 15:21:29.50>>595
0610デフォルトの名無しさん
2012/10/10(水) 15:22:59.740611デフォルトの名無しさん
2012/10/10(水) 15:24:21.430612デフォルトの名無しさん
2012/10/10(水) 15:25:01.440613デフォルトの名無しさん
2012/10/10(水) 15:33:46.06>607
0614デフォルトの名無しさん
2012/10/10(水) 16:44:34.250615デフォルトの名無しさん
2012/10/10(水) 17:08:25.96>>605
0616デフォルトの名無しさん
2012/10/10(水) 17:53:43.600617デフォルトの名無しさん
2012/10/11(木) 05:52:17.82char *p = new char[N] のときは
delete p; で桶なんだな
0618デフォルトの名無しさん
2012/10/11(木) 09:22:31.850619デフォルトの名無しさん
2012/10/28(日) 21:46:47.23コンパイラの実装にもよるが、確かポインタpが指す先頭byteの前の
4byte領域にnewで確保した領域のサイズ(バイト数)が記憶されていた
ような。
delete [] p;
した時はこのサイズを読みに行って正しく解放している。
0620デフォルトの名無しさん
2012/10/28(日) 23:19:37.75>605
0621デフォルトの名無しさん
2012/10/31(水) 17:10:08.11ソリューションプロジェクトの中にいくつかプロジェクトを用意しているのですが、どのプロジェクトを実行しようとしても、必ず一番上にあるプロジェクトが実行されてしまいます。
手順としては
1.ソリューションエクスプローラーから特定のプロジェクトを右クリックしてリビルド
2.デバッグなしで開始
です。
別のソリューションプロジェクトを作成すれば別のプロジェクトを一つだけ実行できるようになるのですが、大変面倒なため一つのソリューションプロジェクト内で個々のプロジェクトを実行できるようにしたいです
Visual C++2010 , WIndows 7 64ビット
0622デフォルトの名無しさん
2012/10/31(水) 17:13:40.44してやればいけるけど、デバッグなしで開始を右クリックメニューに入れちゃうとか
0623デフォルトの名無しさん
2012/10/31(水) 17:20:51.31その一番上のプロジェクトが太字になってたら
>>622の言う通りスタートアッププロジェクトに指定されてる
0624デフォルトの名無しさん
2012/10/31(水) 17:51:31.75ちなみにスタートアッププロジェクトをどのプロジェクトにも設定しない方法はありますか?
難しいプログラムは作らないためにひとまとめでデバッグするような機会はないので、可能であれば外したいです
0625デフォルトの名無しさん
2012/10/31(水) 17:59:05.750626デフォルトの名無しさん
2012/10/31(水) 18:01:29.97どのプロジェクトにも設定しないと言う事は実行しない事になる
つまりビルドだけすれば望みの動作になる
0627デフォルトの名無しさん
2012/11/01(木) 06:18:27.78無料版2010で使えるソフトが、手持ちの有料版2003だと
DC_PEN
DC_BRUSH
SetDCPenColor
SetDCBrushColor
あたりでエラーになります。
参照:
http://blog.goo.ne.jp/masaki_goo_2006/e/d3c18365234ffb3383f5c30e32c83cf5
他の関数使うとか代替方法あります?
なければ2003より上のを買わなきゃダメですかねぇ。
0628デフォルトの名無しさん
2012/11/01(木) 08:27:21.790629デフォルトの名無しさん
2012/11/01(木) 11:06:01.910630デフォルトの名無しさん
2012/11/01(木) 14:59:17.340631デフォルトの名無しさん
2012/11/03(土) 13:32:34.11「マルチバイト文字」と「Unicode」は分かるのですが、
「設定なし」とは具体的にどういう扱いになるのでしょうか??
「マルチバイト文字」としたときの記述法でコンパイルできるので、
「マルチバイト文字」になっているのでしょうか??
0632デフォルトの名無しさん
2012/11/03(土) 17:48:58.88VC2005デコンパイルすると誤動作するとか、もしくは2010や2012で誤動作するとかが起きかねないから。
逆に、他の処理系から移植しようとして(つまり手元にあるのが2008じゃない)の質問ならしかたないが...
0633デフォルトの名無しさん
2012/11/03(土) 18:57:26.742、ボタンを押したらファイルを一つずつ指定のアプリで開く
3、開いたアプリにキー操作を送る
4、CPU使用率で2の動作を連続してできるようにする
これがやりたいことなんだけど1の段階で躓いてます。
ヒントお願いします。
0634デフォルトの名無しさん
2012/11/03(土) 19:48:48.030635631
2012/11/03(土) 22:24:51.72>そういう処理系依存の記述は互換性をそこなうので避けるべき
処理系依存とはどの設定のときのことを指すのでしょうか?
Unicodeの場合、w付きのAPIやリテラル文字列の前にLを付けたりと、
気持ち悪いので使いたくないです。
Unicode、マルチバイト文字のいずれでもコンパイルできるようにする
t付きのマクロも同様です。
これらを付けなくてもよい「設定なし」あるいは「マルチバイト文字」が
良いのですが、デメリットは何でしょうか?
多言語対応が難しいかもしれませんが、日本語だけでよいです。
0636デフォルトの名無しさん
2012/11/03(土) 23:22:40.63予期せぬ誤動作でデバッグ作業が長引く恐れがある。
>Unicodeの場合、w付きのAPIやリテラル文字列の前にLを付けたりと、気持ち悪いので
とか、
>Unicode、マルチバイト文字のいずれでもコンパイルできるようにする、t付きのマクロも
とかが、まさに、その危険を避けるための手順。
Windowsバージョンが変わると動作しなかったり動作異常を引き起こしたりしてユーザが苦労するソフトを作る茨の道へまっしぐらだぞ、それ。
0637631
2012/11/03(土) 23:32:07.17分かりました。
w付きAPIやL付きリテラル文字のほうがまだマシなので、
Unicodeが書くことにします。
ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています