トップページ⇒tech
986コメント346KB

★初心者にVisual C++を教えるスレ★ Part38

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/11/03(木) 00:54:48.61
Visual C++入門者・初心者からの質問を、
お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう、特に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/
0125デフォルトの名無しさん2012/01/01(日) 20:20:07.85
動的にってnewを使ってってことか?
0126デフォルトの名無しさん2012/01/01(日) 21:10:00.53
>>124
何を言っている?
デストラクタにはそのクラスが破棄されたときに必要な処理を書く。
デストラクタで破棄するわけじゃない。
0127デフォルトの名無しさん2012/01/01(日) 21:27:11.09
>>124
何を聞きたいのかよく分からないが、

new で動的に作成したクラスを使い終わったらどうするかという話なら
delete で削除するのが正解、デストラクタは利用者が呼び出すものではない

あるクラスAのインスタンスに付随する情報をクラスBとして動的に作成した場合の、クラスBを破棄するタイミングの話なら
クラスAのデストラクタで削除するのが自然ではある
0128デフォルトの名無しさん2012/01/02(月) 01:35:11.70
コンストラクタ内でいくつかのメンバ(ポインタ)に
newで別のインスタンスを生成し
デストラクタでdeleteしているのですが
コンストラクタ途中で例外か例外じゃなくても
new出来なかったりで中断する必要がある場合
途中まで生成していたメンバのインスタンスが
デストラクタで解放されることは期待出来ますか?
0129デフォルトの名無しさん2012/01/02(月) 02:15:47.55
>>128
コンストラクタ内で例外を発行したら、インスタンス生成は完了しないので、デストラクタも呼ばれない
以下のような感じで処理するとか、ひと工夫必要になる

class A{
X* x;
Y* y;
A(){
try{
x = y = NULL;
x = new X; y = new Y;
catch(...) {
clear();
throw;
}
}
~A(){
clear();
}
clear(){
if (x != NULL) delete x;
if (y != NULL) delete y;
}
};
0130デフォルトの名無しさん2012/01/02(月) 02:39:13.46
ありがとう
A() : x(NULL), y(NULL) {
と書くのは良くないですか?
0131デフォルトの名無しさん2012/01/02(月) 02:48:58.29
>>130
メンバ初期化リストを使う方が正解
0132デフォルトの名無しさん2012/01/02(月) 11:03:39.23
delete NULL は有効だからdelete時にNULLチェックは無駄
0133デフォルトの名無しさん2012/01/04(水) 22:31:34.51
>>132 delete []も?
0134デフォルトの名無しさん2012/01/05(木) 17:01:41.04
人民元暴落間近、実はマイナス成長の中国GDP

アメリカの研究者の中には、今年の中国のGDPはマイナス10%ぐらいではないかと推計する人もいます。
そもそも中国の国家統計局が出している数字は、「架空の物語」です。

全国人民代表大会で決まった成長率を覆すような数字を、地方政府が上げるはずがない。16%だの24%だの、ありえない数字を出してきます。
みんなそれを知っていますから、加減してほどよい数字を作り上げる。それが国家統計局の仕事なんです。

中国の現状からすればGDPが上がるとは思えません。個人消費は明らかに減っています。住宅はといえば6500万戸が空き家状態。
企業は設備投資どころではなく、政府の財政支出も限界に来ています。

日本の新聞もようやく中国の不動産バブル崩壊について書き始めました。しかし内容は必ずしも正しくない。
不動産価格が上海で25%、北京で20%下落したといいますが、実際には40%ぐらい下がっていると思われます。

JBPRESS
http://jbpress.ismedia.jp/articles/-/34131?page=2


世界のGDP(単位10億ドル)

1位 アメリカ 14,526.55
2位 中国 5,878.26
3位 日本 5,458.80

↓

1位 アメリカ 14,526.55
2位 日本 5,458.80
3位 中国 5290.43
0135デフォルトの名無しさん2012/01/12(木) 21:32:10.22
VC++2010, SDKで開発しています。

EditBoxに関する質問なのですが、
入力が空っぽの場合には、グレー文字で入力のヒントを
表示する機能は持っていますでしょうか?

MFCのCEditクラスには該当するもの(SetCueBanner)が
見つかりましたが、SDKでは自分で
ゴリゴリ書くしかないのでしょうか?

よろしくお願いします。
0136デフォルトの名無しさん2012/01/12(木) 23:02:12.54
EM_SETCUEBANNER
0137デフォルトの名無しさん2012/01/13(金) 00:15:17.21
>>136
ありがとうございます。
まさか名前そのままでしたか。

WM_INITDIALOGで、
SendMessage(EditBoxのハンドル指定, EM_SETCUEBANNER, 1, (LPARAM)TEXT("ヒントです"));

と書きましたが、ヒントは表示されませんでした。
OSはWin7の64bitです。
0138デフォルトの名無しさん2012/01/13(金) 09:34:25.12
>>137
UNICODEアプリにしてる?
0139デフォルトの名無しさん2012/01/13(金) 09:51:43.02
>>138
すみません。
コモンコントロールの使用に必要な
マニフェスト作成を忘れていただけでした。
動作確認できました。

また、ユニコードで作っています。
0140デフォルトの名無しさん2012/01/13(金) 18:24:07.97
プロジェクトのプロパティページの"構成"に
アクティブ(Debug)
Debug
Release
すべての構成
とあります。DebugとReleaseで設定を変えるということは分かるのですが
アクティブ(Debug)とすべての構成とは、何のため、どういうときに使われるものなのでしょうか?
よろしくお願いします。
0141デフォルトの名無しさん2012/01/13(金) 19:23:06.29
アクティブは今IDE上で選んでるもの。
IDE上でDebugを選んでると、アクティブはアクティブ(Debug)となり、
構成でDebugを選んでもアクティブ(Debug)を選んでも同じ。

すべての構成は、すべての構成で共通するもの。
構成がDebugとReleaseの二つしかない場合、
その二つで同じ設定になっているものは表示され、
違う設定になっているものは空の表示がされる。
どれか設定をするとDebugとReleaseの両方に同じ設定がされる。
0142デフォルトの名無しさん2012/01/14(土) 03:43:14.60
ありがとうございます
やはりそうでしたか
0143デフォルトの名無しさん2012/01/14(土) 21:47:14.24
コンボボックス内の文字列がリソースファイルのDLGINITで設定されているVCのプログラムを見ました。
これはどのようにしたらこのやり方ができるのでしょうか。
DLGINITでググっても解説等が見つかりませんでした。
どうやらActiveXを使うことと関係があるらしいのですが。
0144デフォルトの名無しさん2012/01/14(土) 23:06:50.33
その見たというVCのプログラムを調べりゃいいだろ
0145デフォルトの名無しさん2012/01/14(土) 23:12:29.11
>>144
VisualStudioの使い方のことです。
0146デフォルトの名無しさん2012/01/15(日) 03:39:10.47
>>143
VC6ではダイアログにコントロールを配置するときにコンボボックスを
右クリックしてプロパティを表示すると初期文字列を設定できるけど
VS2002以降は分からない
0147デフォルトの名無しさん2012/01/15(日) 12:18:40.28
2010じゃMFCだとできるけど、Win32だとグレーになって入れられないな。
0148デフォルトの名無しさん2012/01/15(日) 14:30:37.69
vs2003だとコンボボックスのプロパティの「動作」にある
Dataに文字列入れたらできた。複数文字列はセミコロン区切りで。
Dataはmfcアプリのみ入力可能。
0149デフォルトの名無しさん2012/01/17(火) 21:08:32.14
大ざっぱな質問になってしまうのですが
C++で指定のswfのアニメーション流すことは可能なのでしょうか?

WEBカメラで画像をチャプターし、その画像の結果で
指定のswfアニメーションを流したいと考えています。
開発環境はVC2008です。

よい方法などありましたら、アドバイスお願いします。
0150デフォルトの名無しさん2012/01/17(火) 21:31:11.24
COM使えば
0151デフォルトの名無しさん2012/01/18(水) 00:33:47.61
馬鹿には無理
0152デフォルトの名無しさん2012/01/18(水) 10:28:48.35
VCで作ったアプリのハンドルリークを検出する方法は、どのようなものがありますか?
deleteし忘れのときのように出力してくれると便利なのですが。
0153デフォルトの名無しさん2012/01/18(水) 11:27:50.98
・タスクマネージャのパフォーマンスタブ
・CRT デバッグ ヒープ関数
・市販のツール

でも delete 忘れとかなら、最初の初期化と、解放後の初期化を確実にやって、
プログラムやインスタンスが終了するタイミングで、自分の持ってるポインタが NULL になっていることを
確認するのがいちばん早いと思うんだ。
0154デフォルトの名無しさん2012/01/20(金) 21:39:50.94
失礼します。
VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか、宣言の場所が悪いのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?
0155デフォルトの名無しさん2012/01/20(金) 22:19:53.46
>>154
VC++と言うと、今だに(と言うかC++/CLIが見捨てられてるだけなんだが)MFCでのプログラミング前提だから、聞くならC++/CLIと明示されてるスレで聞いた方がいい

くだすれC++/CLI(初心者用)part2
http://toro.2ch.net/test/read.cgi/tech/1268613679/
0156デフォルトの名無しさん2012/01/20(金) 22:46:28.91
>>155
他スレでもそちらに誘導されてしまいました。。
なんかマルチみたいで申し訳ないです。
そちらで質問したいと思います。
わざわざ有難うございます。
0157デフォルトの名無しさん2012/01/21(土) 17:37:56.09
みたいで
0158デフォルトの名無しさん2012/01/21(土) 22:34:23.48
VC++を使い始めて2週間目です。
コンソールアプリケーションでしばらく遊んでいたのですがこの度windowsフォームアプリケーションへ挑戦することにしました。

>>8でも出ているのですが、コンソールアプリケーションの時には自動でインデントしてくれていたのに、ウィンドウズフォームアプリケーションではインデントしてくれなかったり
this->と打っても反応がなかったりするのは64bitに非対応ということなのでしょうか?
ちなみにVBのVSでは正常に動いていたように思います。

一応再インストールはしてみたのですが効果なし、他の64bit使いの方のお話をお聞かせ下さい
0159デフォルトの名無しさん2012/01/21(土) 22:40:27.58
this->と入力すると、ステータスバーにIntelliSense: 'C++/CLIで使用できません'と出るのですが64bitでは使えないのでしょうか
0160デフォルトの名無しさん2012/01/21(土) 22:44:15.76
連投ごめんなさい2010ではまだ使えないのですね
0161デフォルトの名無しさん2012/01/21(土) 22:59:36.47
このスレで言うことじゃないけど。
C++/CLI を使うんなら、ネイティブな C への橋渡しとかを考えている場合以外は C# でやった方がいいよ。
0162デフォルトの名無しさん2012/01/21(土) 23:00:14.43
また一人犠牲者が出てしまったか
0163デフォルトの名無しさん2012/01/22(日) 01:30:21.35
C++/CLIは半ば放置されてるからな…
0164デフォルトの名無しさん2012/01/26(木) 17:29:08.37
1つのソリューションの中に2つのプロジェクトがあって、

Solution
 Project1
 Project2

Project1で定義されているクラスを、Project2で使用する方法を教えていただけないでしょうか?
依存関係を設定すれば使えると思ってたんですが、ハマってしまって。。。

ヘッダーをインクルードして、クラスを実体化しようとするとエラー「LNK2019: 未解決の外部シンボル」が出てしまいます。

環境はVC2002です。よろしくお願いします。
0165デフォルトの名無しさん2012/01/26(木) 17:30:31.05
.lib
0166デフォルトの名無しさん2012/01/26(木) 17:37:16.76
素早いw
両プロジェクトともexeの場合ってダメなんでしたっけ?
良く考えればダメですよね。。。

もうちょっと具体的に言うと、Project1が開発アプリで、Project2がテストアプリで
Project1のクラスをProject2で実体化してテストしたいんです。

良いやり方があればご教授いただきたいです。
0167デフォルトの名無しさん2012/01/26(木) 18:02:54.86
ん、単純にProject2にソースコード追加すればいいだけですねorz
すみません、お騒がせしました
でもここに書き込んだら考えが整理された気がしますw

もっと良いやり方ってありましたっけ?有るようでしたら教えて頂ければと思います。
どうもありがとうございました。
0168デフォルトの名無しさん2012/01/26(木) 22:05:16.82
ん? ふつうに出来たんだが。w
VisualStudio2010 の C++/CLI で以下の通り。

1. 同じソリューション内に form アプリケーション(Project:A)と
  クラスライブラリ(Project:B)を作成
2. Project:A で参照の追加を設定し、Project:B をプロジェクトごと参照設定する
3. Project:B に適当にクラス(ClassB)とそのメソッド(ClassB::test)を作る
4. Project:A の適当なところで、 B::Class のインスタンスを作成する
5. そのクラスのインスタンスからメソッドを呼び出す (gcnew B::Class())->test()

うん。ふつーに出来た。
名前空間はちゃんと設定した? 上の例だと A とか B のことだけど。

ちなみにヘッダファイルのインクルードはやってない。
上は exe & dll だけど、マネージの実行ファイルなら exe & exe でも同じように出来る。
0169デフォルトの名無しさん2012/01/27(金) 00:47:40.44
exeをサービスに登録して動かしているんですが、
サービスより起動しようとするとすぐに停止になってしまいます。
イベントビューアからログを見るとイベントID7034でした。

これまでは普通に起動していたんですが、
exeの中で使用しているメッセージ出力に使うファイルを、
配置してやったとたんになってしまいました。

特にこれが問題になってるとは思ってなくて、
(Visual Studio 2005でコンパイルしたexeでは問題なかったため)
Visual Studio のバージョンを変えてコンパイルしたので、
何かあるのかなと思ってます。

Visual Studio 2008でサービスを起動するコーディングをする際に、
2005と違う点は何かあるんでしょうか?
0170デフォルトの名無しさん2012/01/27(金) 12:32:25.27
>>169
アプリケーションのイベントログにエラーが出てないか?
0171デフォルトの名無しさん2012/01/27(金) 21:04:33.86
その情報でどうしろと。w
0172デフォルトの名無しさん2012/01/27(金) 23:18:13.39
>>170
それが7034ですね。

>>171
ですよねー。w
コーディングを載せるわけにもいかなくて、
何を載せるべきかと。。。w
0173デフォルトの名無しさん2012/01/28(土) 00:26:52.91
わかってんじゃねーか。w

それ、「プログラムは予期せず終了した」だよな。
169 だとどうとでも読めるけど、もとはサービスじゃなくて普通の exe として起動してたの?
サービスとして起動したんだとしても、やることは変わらないだろ。

・元の状態に戻して動作確認
・元の状態で VS2010 でビルドして動作確認
・いろんなところを削って、とにかくただ起動するだけの状態にして動作確認
・少しずつ元の状態に戻していきつつ、どこで異常終了するようになるかを確認

最後のが確認できれば解決したも同然だろ。

もう忘れちゃってるけど、マネージならサービスプログラムとして作ってても他の実行ファイルから
簡単に中身を参照することができるから、普通のプログラムとして起動した後にすぐに
そのサービスプログラムを参照する試験用プログラムを組めばデバッグも楽そうだよな。

まあ触りのない部分だけでもソースを晒してくれたら協力してやるよ。w
0174デフォルトの名無しさん2012/01/28(土) 01:54:40.26
>>173
いえ、最初からサービスとして起動するためのexeですよ。
んで、ちゃんと起動するんですよ。
ただ。

その処理の中で、ログを吐く処理があるんですね。
そのログは設定ファイルを読み込んで、そのファイルの中の文言を吐いてるんですけど、
設定ファイルを指定のディレクトリに置いたとたん。
起動しなくなってw

そのファイルを置いてなければ動くんですが、置いたら動かない。。。
よーわからん状態w
ただ、サービスが停止するまでのログはちゃんと吐いてるんで読み込まれてないとか、
読み込みでエラーになってるわけではなさそう。。。
0175デフォルトの名無しさん2012/01/28(土) 11:42:43.39
いや、だから。

・単純に起動するだけ
・単純に起動するだけ & その設定ファイルを読み込むだけ

の状態にしてどうなるかを確認。
これで設定ファイルを読み込むようにして不正終了するのを確認できたら犯人が確定だろ。
現状ではそう思い込んでるだけかもしれんだろーが。まずは実証確認をするべきだ。

で、ログ出力機能があるなら、最悪、全ステップの前後にログをはさんで、場所を確定。
それで解決できないならそもそもおまえじゃどうしようもないってことじゃないのか。

どういう構造かは知らんけど、素人が動くだけのプログラムを作ったのなら、
エラー時のフォローなんて入れてないんだろうから、たとえば設定ファイルが xml 形式なら
参照先のノードがなかったり、名前空間が違ってたり、文字コードが違ってたりして
パーサが出してる例外を捕捉してないだけなんて事例はくさるほどある。

171 を自覚しててまだ続けるなら、ほんとうに触りのないレベルに削ったコードを晒せ。
以降はそしたら手伝ってやるよ。
0176デフォルトの名無しさん2012/01/30(月) 18:17:45.78
>>172
7034がアプリケーションログに出てるの?
システムログじゃなくて?
まあどっちでもいいや
見るべきところがはっきりしてるのにグダグダやってるようじゃ
「お前には無理」としかいいよがない
0177デフォルトの名無しさん2012/01/31(火) 18:56:00.30
Visual C++ の std::copy 関数を
POD型の std::vector なんかで使うと
バイナリコードでは最適化されて
REP MOVSQ 命令になってくれたりしますか?
0178デフォルトの名無しさん2012/01/31(火) 21:13:33.26
浅学でよく知らんのだが、それって関係あるのか?
01791772012/01/31(火) 23:51:38.39
巨大な行列を扱うライブラリを書いているんですが
コピー処理はアセンブラ使った方が速いのかな・・・と。
0180デフォルトの名無しさん2012/02/01(水) 04:47:43.05
Visual Studio 2008 Pro って案外不安定。
20行程度の参考書のIF文のサンプルコードを書き込み、
デバッグで実行しただけで固まりそうになる。

VS 2010を買うべきか、VS11まで待つべきか。
0181デフォルトの名無しさん2012/02/01(水) 04:59:27.61
買うべき
VS11が出たらまた買えばいい
0182デフォルトの名無しさん2012/02/05(日) 15:12:37.88
質問です。空のWin32プロジェクトを作成し、次のコードを入力します。

#include <Windows.h>
static const CHAR str[] = "いやんばか〜ん";
static CHAR func(int x)
{
return str[x];
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
return 0;
}

ご覧の通り、strはfunc()から参照されていますが、
func()はどこからも参照されていない状態です。
これのReleaseビルドを行うと、不要なはずの"いやんばか〜ん"が
なぜかexeファイルの中に埋め込まれてしまうのですが、
これが埋め込まれないようにする方法があれば教えてください。
Visual C++の2005でも、2010 Expressでも結果は同じでした。
いずれもプロパティはデフォルトのまま使っているので、
"/OPT:REF"は有効になっているはずなのですが・・・。
0183デフォルトの名無しさん2012/02/05(日) 15:18:54.65
#ifdef _DEBUG
static const CHAR str[] = "いやんばか〜ん";
#endif
0184デフォルトの名無しさん2012/02/05(日) 15:20:29.46
str変数は削除されてもリテラル文字列が消えるわけない
どこで使われてるかわかったもんじゃないし、実行時の速度に影響するわけでもなし。
0185デフォルトの名無しさん2012/02/05(日) 15:34:06.36
・/OPT:REF がデフォルトで設定されているって記述は見つからなかった
・「はず」じゃなくて、自分で設定して試してみた?
・VC2010 の Win32 コンソールプログラムで試した
 - "return str[x];" の行をそのまま      -> 実行ファイルに文字列あり
 - "return str[x];" の行を retuen NULL; に -> 実行ファイルに文字列なし

結論
 /OPT:REF を付けても実行ファイルに出力されない関数内とかを含めてどこかで参照してると
 実行ファイルにその参照してるデータも出力されるっぽい。

対策案
 しかたないので、使わない部分を #ifdef で囲って切り替えられるようにするとか?
0186デフォルトの名無しさん2012/02/05(日) 17:40:20.25
お返事をいただき、ありがとうございます。

>>183
#ifdefはどうしてもという場合の最終手段ですねw

>>184
そういうものなんですかねぇ・・・。
static宣言をしていますし、少なくともそのファイル内で
参照されていなければ不要なのは明らかだと思ったのですが・・・。
ちなみにリテラル文字列ではなく配列要素を直接指定しても同じでした。

>>185
すみません、言い方が悪かったです。プロジェクト作成直後の
Releaseビルドの設定は/OPT:REFになっているので、
参照されない関数やデータは削除される「はず」という意味でした。

その後、いろいろ試してみたところ次のことが分かりました。(いずれも2010 Express)
・exeに埋め込まれているのはデータのみで、関数本体は削除されている。
・constを外してもやはりデータは残る(セクションの位置は移動する)。
・データを関数の外ではなく、関数内で直接定義すればデータも削除される。
・複数の関数から同じデータを参照する場合でも、それぞれの関数内で定義すれば
不要であればデータは削除されるし、必要な場合でも1つにまとめられる。

というわけで、たとえ同じデータであっても関数の外には出さずに、
各関数内で定義することでこちらが望む動作になるようです。
とりあえずこれで何とかなりそうです。どうもありがとうございました。
0187デフォルトの名無しさん2012/02/06(月) 20:05:05.09
visual studio c++ 上でlibjpegを使ってBMPからJPEG画像として保存
しようと頑張っているのですが、どうしてもjpeg_create_compressで落ちてしまいます。

struct jpeg_compress_struct comp;
struct jpeg_error_mgr jerr;

comp.err = jpeg_std_error(&jerr);
 jpeg_create_compress(&comp); ←ここでおちます;;
0188デフォルトの名無しさん2012/02/06(月) 20:12:32.88
GDI+でも使えば?
0189デフォルトの名無しさん2012/02/06(月) 20:57:36.39
gdiplusを使ってできました。ありがとうございます。
0190デフォルトの名無しさん2012/02/12(日) 18:13:21.14
Visual C++ 2008 Express Editionを使っています。
hとかcppファイルは関連付けられていてvisualstudioで開くでのですが、
これらを他のツールから開くときにコマンドラインパラメータ等で行数を指定したりできますか?
開いた瞬間に指定行に移動するようにしたいのですが。
0191デフォルトの名無しさん2012/02/12(日) 18:32:37.85
>>190
そのツールにそういう機能があるかどうか、による。
0192デフォルトの名無しさん2012/02/12(日) 18:41:43.95
>>191
すいません、書き方が悪かったです。
他のツールからVCExpress.exeを指定してVCExpress.exeで開くという意味です。
どうもググってみましたがそういうスイッチは見当たらないようですね。
0193デフォルトの名無しさん2012/02/12(日) 21:00:59.01
UWSCから起動&操作するとか
0194デフォルトの名無しさん2012/02/14(火) 13:10:30.96
Lや_T()マクロを使わずに文字列をそのままUnicodeのものとして扱いたいのですが、方法はありますか?
0195デフォルトの名無しさん2012/02/14(火) 13:35:11.20
ttp://0xcc.net/blog/archives/000183.html
こういうこと?
0196デフォルトの名無しさん2012/02/19(日) 11:14:57.83
VC++2008で、「デバッグ開始」でコンソールプログラムを実行すると、
最後まで処理した後、勝手にコンソール画面を閉じて終了してしまいますが、
「デバッグなしで開始」で実行すると、コンソール画面を表示したままにしてくれます。

このような違いはなぜ起こるのでしょうか?
「デバッグ開始」のこの仕様は不便に思うのですが、
そのようにしてまで大事なことが他にあるのでしょうか?
0197デフォルトの名無しさん2012/02/19(日) 11:39:00.30
それはマイクロソフトの技術者に聞いてくれとしか。
似たような疑問はたくさんあるみたいだから、ぐーぐる先生に質問してみるとか。

if ( ::IsDebuggerPresent() ) system("pause"); みたいなコードを勝手に付けてるんじゃない?
0198デフォルトの名無しさん2012/02/19(日) 15:07:35.26
>>196
デバッグしてるのに、終了まで流すのは普通ありえないから
01991962012/02/19(日) 15:10:27.22
>>197
調べてみたんですが、最後止まらずに終わってしまう理由については分かりませんでした。

>>198
なるほど、そういう前提での仕組みですね。
ありがとうございました
0200デフォルトの名無しさん2012/02/19(日) 17:11:34.75
三日前にVisual C++2010をDLした超初心者です。

1.ラベルと変数を3つずつ(時間、分、秒)用意
2.ボタンを押すとタイマー(intervalは1000=1秒)が起動
3.イベントが発生する度に「秒」の変数を+1する
4.「秒」の変数が59以上になったら「秒」の変数に0を代入して「分」の変数を+1する。分→時間も同様

Windowsフォームアプリケーションのテンプレートから、上のようなタイマーをつくろうとして、
自分が他のタイマーツールと比較した時はズレはなかったのですが、
他の人が試したところ、1分経つ毎に1秒ズレているようなんです。

これはSystem.Windows.Forms::Timer(?)が何かに依存していてダメなんでしょうか?
それともそんなことはなく、文に問題があるのでしょうか?
0201デフォルトの名無しさん2012/02/19(日) 17:22:55.60
>>200
現在時間をタイマーに依存するのがダメ、そこまでの精度はない
タイマーイベントの中で現在の時刻を都度取得すればいい
0202デフォルトの名無しさん2012/02/19(日) 18:00:05.23
現在時刻とか取得できるんですね・・・
つまり
1.変数:時間、分、秒、基準時刻を用意
2.タイマーを起動するボタンを押した時の現在時刻を取得、変数:基準時刻に代入
3.タイマーイベント内で現在時刻を取得、基準時刻と現在時刻の相対時刻を取得。変数:時間、分、秒に代入
4.現在時刻を変数:基準時刻に代入

こんな感じにすれば一時停止にも対応出来るって感じですかね
なんとなくつかめました、ありがとうございます
0203デフォルトの名無しさん2012/02/25(土) 16:34:01.56
project eulerの問12を解きました。
↓問題です。
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2012

自分はこのようにプログラムを書いたのですが、
実行時間が長すぎることが気にかかります。
http://codepad.org/csyM6H64

どのように改善すれば時間短縮することができるのでしょうか。
お願いします。

このプログラムは、偶数か奇数かなら、
偶数の方が約数の数が多いだろう と思って作ったので、偶数だけを対象にしています。
0204デフォルトの名無しさん2012/02/25(土) 21:47:13.56
>>203
宿題スレに行くべきだね
完全力技でなく、map などを使って
1. 一旦素因数分解して、素因数分解の結果から解を求める
2. 素因数への分解仮定で、すでに計算結果の出てるものは再利用する
とかやればいくらか早くなりそうな感じはするけど
02052042012/02/26(日) 02:13:52.34
>>203
失礼、見直したら宿題というわけではないのか
Visual C++でもない気がするけどどのスレなのか分からないから答えておくと
以下の2点だけでそれなりに改善できそうな気がする (>>204は考えてみたら面倒な割にコストが微妙そうだった)

1. 除算するとき、除数と商は対になるはずなので、計算は半分で良い
20の約数(1,2,4,5,10,20)なら
20/4が割り切れた時点で、4と5の両方が求められる
2. sqrt(sum)で除数と商が等しい状態になる、それ以上は計算しなくてよい

具体的には
sum2 = sum >> 1;
for(int idx = 3; idx < sum2; idx++){
を
int sum2 = int(sqrt((double)sum));
for(int idx = 3; idx < sum2; idx++){
として、

if (!(sum % idx)) {count++;}
を
if (!(sum % idx)) {
 count++;
 int div = sum / idx;
 if (div != idx) {count++;} //除数と商が等しい場合を除き、対としてカウントする
}
とする

あと、数値が連続なら特定以上の約数を持つ最小の数値が2で割り切れるのは確実と思うけど、
対象が連続でないので、偶数であることは保証されないと考えるほうが安全と思う
0206デフォルトの名無しさん2012/02/26(日) 14:44:39.25
>>205
なるほど!
約数を根本的に考えればそうなりますね!
そんなことにも気づかないなんてばかでした・・・。

それと、
if (!(sum % idx)) {count++;}
を
if (!(sum % idx)) {
 count++;
 int div = sum / idx;
 if (div != idx) {count++;} //除数と商が等しい場合を除き、対としてカウントする
}
とする
のところは、

for(int idx = 3; idx < sum2; idx++){
  if(!(sum % idx)){
   count += 2;
  }
}

if(idx == sum2){
count--;
}
とした方が若干速いと思います。

ありがとうございました!
0207デフォルトの名無しさん2012/03/10(土) 21:55:24.62
練習としてフォームに線を引くプログラムを書いています

フォーム上にあるButtunを押すとフォーム上に線が出てくるようにしたいです。
んでそれは完成しました。

以下、質問です。
クラスウィザードを使って描画クラス(Draw.hとDraw.cpp)を作り、
描画オブジェクトを分離しようとしました。
しかし、Draw.hからFormに線を引くオブジェクトを作成する方法が分かりません。
フォーム上のボタンに書き込んだ
Graphics^ gr2 = this->CreateGraphics();
のthisの部分を
System::Windows::Formsに書き換えるだけじゃ駄目なんですか?

ちょっと分かりにくい質問ですがどなたか回答いただけると幸いです
0208デフォルトの名無しさん2012/03/10(土) 21:55:47.64
ageてしまいましたすみません
0209デフォルトの名無しさん2012/03/12(月) 02:02:52.54
駄目
0210デフォルトの名無しさん2012/03/12(月) 09:25:48.15
これってアセンブリコード吐けるの?
0211デフォルトの名無しさん2012/03/12(月) 09:58:12.99
そりゃはける
0212デフォルトの名無しさん2012/03/12(月) 10:41:04.85
ゲロゲロ
0213デフォルトの名無しさん2012/03/12(月) 11:05:01.11
>>207
そのレベルでC++/CLIは無駄な気がする。
FormやりたきゃC#、C++やりたきゃCLIじゃないほう
両方同時にやってもC++/CLIやるよりまし。
0214デフォルトの名無しさん2012/03/12(月) 21:21:25.38
>>207
基本的に上に同じなんだが。

やり方の方ね。
そりゃダメだろ。コンパイルも通らないんじゃないの?
是非はともかく、一番簡単な方法は form のクラスに this->CreateGraphics(); を返すメソッドなりを作って、
Draw.cpp の方でそれを受け取って描けばいいんじゃね?
0215デフォルトの名無しさん2012/03/13(火) 12:58:49.23
質問なのですが、出力タブに特定の警告を出さないようにすることはできないでしょうか?

具体的には、
「'BOOL' : ブール値を 'true' または 'false' に強制的に設定します」という
警告が大量に出てきて本当にエラーが出ているところが分からなくなるので、
なるべくソースコードは変更せず警告を消す方法が無いかを探しています。

何とかならないでしょうか
0216デフォルトの名無しさん2012/03/13(火) 12:59:59.72
すいません。

VisualC++2008ExpressEditionを使用しています。
0217デフォルトの名無しさん2012/03/13(火) 13:12:57.34
#pragma disable でなんとかなるか、、、
typedefで定義しちゃうとか
0218デフォルトの名無しさん2012/03/13(火) 13:47:58.95
#pragma warning(disable:xxxx)
だったな。
0219デフォルトの名無しさん2012/03/13(火) 14:08:07.02
>>215
http://lmgtfy.com/?q=vc+%E8%AD%A6%E5%91%8A
0220デフォルトの名無しさん2012/03/13(火) 19:32:12.17
上手くいきました!
先生方あざ〜す。
0221デフォルトの名無しさん2012/03/13(火) 20:59:11.97
てーか、それ最後の手段だと思うんだが。

BOOL a = TRUE;
bool b = a;

とかやってんだろ? だったら、

bool c = ( a != FALSE );

とかって書き直してやれば済むじゃん。
0222デフォルトの名無しさん2012/03/15(木) 14:09:34.11
配列の中身が重複してるかどうか調べるには
#include<string>を使えばいいんですかね?

具体的に言えば、
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 1
array[4] = 2
array[5] = 3

となっているときに、
array[0]~array[2]までを連結させた数字(123)と、
array[3]~array[5]までを連結させた数字とが等しいですね

って出力してくれる関数を探してます。
find()とか使うといいのかなと考えてたんですが、
文字列にしか使えないって書いてあるので、
配列自体に簡単に使える関数はありますか?
0223デフォルトの名無しさん2012/03/15(木) 14:25:32.76
ないよ
自分で作るしかない
0224デフォルトの名無しさん2012/03/15(木) 15:08:29.50
>>223
わかりました。
ありがとうございます。
■ このスレッドは過去ログ倉庫に格納されています