トップページ⇒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/
0771デフォルトの名無しさん2013/02/07(木) 19:30:51.75
最近 急に大量のpdbを開くようになっちゃったんだけど
そのせいでデバッグが始まるのに10秒くらいかかる

ntdllのpdbなんていらないよー
どうしたらいいの
0772デフォルトの名無しさん2013/02/08(金) 12:29:12.61
オプション→デバッグ→シンボルのリストのチェックを外す
0773デフォルトの名無しさん2013/02/09(土) 11:05:32.28
ソースの総行数知りたいです
0774デフォルトの名無しさん2013/02/09(土) 16:23:20.51
VS のcl で定義済みマクロ一覧を表示するにはどうしたら良いでしょうか?
gcc -E -dM -x c++ -std=c++11 /dev/null | sort
みたいなのと同じことができればOKです
cl /E までは同じようなオプションがあるんだけど、 -dM 相当のオプションってどれなんでしょうか?
cl /? 見てる限りだとわからないです・・
0775デフォルトの名無しさん2013/02/10(日) 02:57:35.94
ヘルプ。
途方もないコードのデバック途中で寝たくなったときってどうしてる?
今、言ったん寝て昼から同じ所スタートでデバックし直したいんだけど…
0776デフォルトの名無しさん2013/02/10(日) 10:31:57.09
>>775
状況が許されるなら寝ればいい。頭が硬くなってるならそれ以上のものはない。
許されないなら、エナジードリンク系でものみながらしなない程度に頑張れ。
0777デフォルトの名無しさん2013/02/10(日) 11:33:41.86
起きる手段があるなら20分くらいの仮眠が効く
0778デフォルトの名無しさん2013/02/10(日) 12:20:45.97
チームでやってるなら、リーダーに要請して順に1時間くらいずつ仮眠を取るのが最善なんだけどね。
疲れてるときに単純にひとりで寝た日には起きたときにはすべてが終わってたりするから怖いよな。。
0779デフォルトの名無しさん2013/02/10(日) 12:37:56.25
1時間だと脳が睡眠体勢に入ってしまうので、、、寝るための準備時間というのなら
そんなもんかなあ。
0780デフォルトの名無しさん2013/02/11(月) 19:53:41.10
>>772
ありがとう!設定をいじってみる
0781デフォルトの名無しさん2013/03/03(日) 11:01:21.58
今まで初期状態でメインプロシージャまでやってくれる形でやってたけど
自分の型みたいなのが出来たから空のプロジェクトで作るようになった

今までに作ったソースを全て自分の型Verに書き換えないと
なんか仕事やり残した感があって気持ち悪い

他の人はこういう経験ある?
あるけど書き換えずに新しいのだけ自分の型Verにしてる?
0782デフォルトの名無しさん2013/03/03(日) 11:15:36.09
気になったやつだけやってる
0783デフォルトの名無しさん2013/03/03(日) 11:25:21.95
プロとしてなら、完成品に対しては出来ない。品質以前に必要な手順がありすぎだし。
趣味としてなら、次に必要になったときに最初から作り直す。
0784デフォルトの名無しさん2013/03/03(日) 13:04:30.30
>>781
分かる分かるw

自分の場合は、新しく作るときに適用するようにして、
過去のは基本的にいじらないなぁ。

でも、新しく作る度に洗練されていく感があって楽しいよ。
0785デフォルトの名無しさん2013/03/03(日) 13:05:00.80
他の人も経験あるんですねありがとうございました
0786デフォルトの名無しさん2013/03/03(日) 21:10:13.68
サブクラス化されたプロシージャ外の変数へアクセスする方法は
ユーザー定義のメッセージを使用してアドレスを渡すくらいしかないですか?
サブクラス化する時に一緒に渡せると楽なのですが
0787デフォルトの名無しさん2013/03/03(日) 21:22:09.76
グローバル変数
0788デフォルトの名無しさん2013/03/03(日) 21:35:51.87
いっぱいありすぎて困る
メッセージの方法知ってるならそれ使えばいい。どんな方法でも渡せればいいんだから多少効率悪くても気にするなって
データ量や用途によって使い分けるものだから、それでも気になるならマルチしてないでぐぐって解決しとけ
0789デフォルトの名無しさん2013/03/03(日) 21:36:32.22
SetWindowSubclass(hWnd, Proc, id, data);
RemoveWindowSubclass(hWnd, Proc, id);
DefSubclassProc(hWnd, Msg, wParam, lParam);
でいいんじゃね
0790デフォルトの名無しさん2013/03/03(日) 21:40:20.39
マルチ見当たらないぞ
レス付きにくくさせるために言ってるのか?
0791デフォルトの名無しさん2013/03/03(日) 21:47:51.70
VIPでやってたんだよ
0792デフォルトの名無しさん2013/03/03(日) 21:53:14.62
URL無しって事は後はわかるな
0793デフォルトの名無しさん2013/03/03(日) 23:25:29.88
>>789
ありがとうございます
dataとして一緒に渡せました
0794デフォルトの名無しさん2013/03/10(日) 16:49:11.64
プログラミング初めて間もない者です
2010のCLRのWindowsフォームアプリで

一問一答形式の問題を作ってるんですが
回答を入力した後、正解かどうか判別して結果表示するプログラムはどうすれば作れますか?

問題文のLabelに文を入れ、回答欄と結果表示用のTextBoxとLabelを置くところまではできたんですが
0795デフォルトの名無しさん2013/03/10(日) 16:50:50.23
C#じゃいかんの?
0796デフォルトの名無しさん2013/03/10(日) 17:03:12.39
VC++のスレで何言ってんの?
0797デフォルトの名無しさん2013/03/10(日) 17:05:18.71
だからいかんのか聞いておる
0798>>7942013/03/10(日) 17:11:23.86
>>795>>797
VisualC#最適ってことはよく聞くけど、実感としてにどれくらい便利か分からない(理解できる知識もない)から
C#を独自に学ぶべきか判断できない感じです
0799デフォルトの名無しさん2013/03/10(日) 17:41:36.81
>2010のCLRのWindowsフォームアプリ
これをそのレベルから始めるなら、C#で同じことやるやり方覚えてから
C++に戻った方が進みが早い気はする・・・

回答したらボタンかなんか押して、そのタイミングで判定するんじゃないの?
ボタン並べてダブルクリックすれば、メソッドできるからそこでやればいいと思うよ。
0800デフォルトの名無しさん2013/03/10(日) 21:47:51.94
たとえば、カンマ区切りのテキストファイルかなにか用意しといて(こんなの)
1,質問1,選択肢a,選択肢b,選択肢c,答えb<CR+LF>
2,質問2,選択肢d,選択肢e,選択肢f,答えd<CR+LF>
3,質問3,選択肢g,選択肢h,選択肢i,答えi<CR+LF>

テーブルに突っ込んで、順次それ表示して「答え合わせ」ボタン押したら答えと比較して合否表示
する感じでいいんじゃねーの?まずは
0801デフォルトの名無しさん2013/03/10(日) 22:09:29.01
ラベルに文字列を表示する方法
TextBoxに文字列を表示する方法
フォームに答えを選ぶボタンをおいて、そのボタンが押されたかどうかを判別する方法
まずはこの3つができるようにならないと。
0802デフォルトの名無しさん2013/03/10(日) 22:34:38.16
>>798
言語問わないならどれで書いてもいい、むしろ求める方向(言語学習したいのか、ものが出来上がればいいのか)
にしたがえばいいのだよ
0803デフォルトの名無しさん2013/03/11(月) 18:12:52.07
http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2010express.html
これやってるんだけど最後のデパックでエラーになってしまう
1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1> DrawPixel.cpp
1>c:\users\www\documents\visual studio 2010\projects\test\test\drawpixel.cpp(1): fatal error C1083: include ファイルを開けません。'DxLib.h': No such file or directory
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
てでるんだけどどこが悪いんですか?

VisualC++ 2010 Express Edition のWin32です
0804デフォルトの名無しさん2013/03/11(月) 18:15:54.47
4.DXライブラリを使用するためのプロジェクトの設定を行う
を全部行ってないから
0805デフォルトの名無しさん2013/03/11(月) 18:34:30.68
>>803
サイト見てみたけど、そのエラーは
↓がうまくできてない
�E 『追加のインクルードディレクトリ』の項目にDXライブラリのパッケージ内に入っている
        『プロジェクトに追加すべきファイル_VC用』フォルダのパスを入力してから、
         再度ダイアログ右下にある『適用』ボタンを押します。
    ( パスの例→  c:\DxLib_VC\プロジェクトに追加すべきファイル_VC用
      なお、DXライブラリをマイドキュメントフォルダに入れるとこれらのパス指定が面倒になりますので
      DXライブラリはなるべく浅いフォルダに入れておくことをお勧めします )
0806デフォルトの名無しさん2013/03/11(月) 22:33:25.37
HelloWorldできた!!!
0807デフォルトの名無しさん2013/03/11(月) 23:16:04.13
おめでとう!!
0808デフォルトの名無しさん2013/03/11(月) 23:45:42.18
ありがとう!!!!!
0809デフォルトの名無しさん2013/03/12(火) 00:28:48.97
セキュアな関数について質問なのですが
strcpy_s(buf1, n, buf2)
strncpy_s(buf1, n, buf2, m)
memcpy_s(buf1, n, buf2, m)
memmove_s(buf1, n, buf2, m)
のn > mが明らかな時は
strcpy_s(buf1, m + 1, buf2)
strncpy_s(buf1, m + 1, buf2, m)
memcpy_s(buf1, m, buf2, m)
memmove_s(buf1, m, buf2, m)
としても問題ない・・・ですよね?
またn > 100, m < 10の時
memcpy_s(buf1, 50, buf2, m)
みたいに適当な値を入れるのはあまりよくないのでしょうか?
これならいっそのこと警告を無視して「_s」の無い関数を使ったほうがいいのでしょうか?
0810デフォルトの名無しさん2013/03/12(火) 00:40:22.08
nはbuf1のサイズを指定する。
それ以下でも動くけど使い方としては間違っている。
0811デフォルトの名無しさん2013/03/12(火) 00:49:44.72
代入先のバッファーサイズ指定だから、質問的に根本的に理解できてないと思う
中途半端に_sを使うぐらいなら、警告無視して従来のでやってた方がいいと思うよ
08128092013/03/12(火) 02:03:10.05
すいません、例えば
char buf[100] = "aaabbbcccdddeee";
char *buf1 = strchr(buf, 'd');
char buf2[] = "CCCDDD";
memcpy_s(buf1 - 3, sizeof(buf) - (buf1 - 3 - buf), buf2, 3);
みたいな時
memcpy_s(buf1 - 3, 3, buf2, 3);
としても期待した結果(buf:aaabbbCCCdddeee)が得られたので計算するのが何だか無駄に思えて・・・
上の第2引数の計算式もあってるか不安になりますし。
でもやっぱり下では何か問題があるのでしょうか?
0813デフォルトの名無しさん2013/03/12(火) 02:05:58.43
ふええ…変数こわいよぉ…
0814デフォルトの名無しさん2013/03/12(火) 03:35:05.30
無駄に思えるも何も、_sを使う意味合いを根本的に間違えてるから、_sを使わなくていいと思うよ
0815デフォルトの名無しさん2013/03/12(火) 08:17:17.77
>>812
>すいません、例えば
>char buf[100] = "aaabbbcccdddeee";
>char *buf1 = strchr(buf, 'd');
>char buf2[] = "CCCDDD";
>memcpy_s(buf1 - 3, sizeof(buf) - (buf1 - 3 - buf), buf2, 3);
strchr(buf,'d')で得られるポインタの3文字前が有効なんて仮定の話はしたくない。

>memcpy_s(buf1, sizeof(buf) - (buf1 - buf), buf2, 3);
これなら正しい
0816デフォルトの名無しさん2013/03/12(火) 09:36:09.64
charが1byteかどうか分からないから、つかうならsizeof(char)で割っておくべき
0817デフォルトの名無しさん2013/03/12(火) 09:43:16.76
charは1byteだと規格で決まっています
0818デフォルトの名無しさん2013/03/12(火) 09:58:41.64
そういう思い込みはドツボることがあるからやめたほうがいいと思うよ
0819デフォルトの名無しさん2013/03/12(火) 10:11:11.76
charは1バイトだろ
1バイトの幅が8ビットとは限らないけど。
0820デフォルトの名無しさん2013/03/12(火) 12:07:26.45
BYTE型はいつでも1バイトだと思ってたことがありました…
08218092013/03/12(火) 12:12:41.81
>>814
少し調べ直しました。意図しない領域への書き込みを防ぐためですよね。
書き込み先のサイズが書き込むサイズより大きいのが明らかなら
この問題は起こりえないので_s無しの関数を使った"方がいい"、と解釈してもいいですか?
警告を消すためだけに_s付きの関数を使ってその上書き込み先のサイズの計算を大着するのはやっぱ言語道断なんでしょうか・・・

>>815
それは考えてなかったです。
確かに計算したアドレスが有効と断定するのは良くないですよね。
ただ実際有効で無いと困るので3行目と4行目の間に
if (buf1 - buf < 3 ) return 0;
を挿入しようと思います。これなら問題無い・・・ですよね?
0822デフォルトの名無しさん2013/03/12(火) 12:17:04.95
適当なことやるくらいなら
_CRT_SECURE_NO_WARNINGS
定義した方がまだまし。
08238092013/03/12(火) 12:53:07.25
>>822
そういう風に警告を消せる事は知りませんでした。
これを定義して書き込み先のサイズが大きいところは_s無しの関数を使うことにします。

みなさんありがとうございました。
0824デフォルトの名無しさん2013/03/12(火) 12:53:45.87
>>822だな。仕事なら中途半端に使われると逆に困る。趣味なら_sは要らないと思う

>>812の例なら
strchrでNULLが返ったときのチェック
buf[-1]やbuf[100]に書き込まないようにチェック
この2つのエラー処理をしておけばいいというか、_sを使うよりそうしといた方がいいし、
もっと言えばstrcpyやstrcpy_sなんて捨ててCStringA::Replace使った方がいいでしょ
08258092013/03/13(水) 14:37:13.19
>>824
趣味です。
ありがとうございます、大変参考になります。
0826デフォルトの名無しさん2013/03/13(水) 17:50:33.34
CreateWindowExのdwStyleパラメータに、既存のウィンドウからGetWindowLongで取得した値を使うとエラーが出ます(87, パラメータが違います)
そもそもCreateWindowExで新しいウィンドウを作った直後にGetWindowLongでdwStyleを取得すると、最初に指定した値とは全然関係のない値が帰ってきていました
どうすればいいのでしょう
0827デフォルトの名無しさん2013/03/13(水) 22:23:30.13
>>826
ウィンドウのクラス名とスタイルの値をさらせ
0828デフォルトの名無しさん2013/03/14(木) 01:00:39.27
http://codepad.org/wt2IZYYA
明解C言語入門編では このコードに12と入力すると0 1 2 3・・・
と数字の間に間隔が空くはずなのですがコードを打ってデバッグしてみると間隔があきません。
01234・・・ という感じになってしまいます。
環境はVisual C++2010 Expressです。
何回も見なおしたのでコードの打ち間違いではありません。
どうすれば間隔が空くのでしょうか?
0829デフォルトの名無しさん2013/03/14(木) 01:08:14.94
http://codepad.org/yBzA0ZgK
0830デフォルトの名無しさん2013/03/14(木) 01:08:29.02
%d が
0831デフォルトの名無しさん2013/03/14(木) 01:08:41.44
printf("%d ",i++);
08328302013/03/14(木) 01:10:31.16
すみません、間違えて送信してしまいました。
>>828
%d が数字部分だから
" %d"または "%d "のように前か後ろに空白を入れればよい
0833デフォルトの名無しさん2013/03/14(木) 07:26:52.38
>>832
ありがとうございます。
よーく見てみたら本には空白空いてました・・・
putcharが原因かと思ってたのにここだったとは
0834デフォルトの名無しさん2013/03/14(木) 16:45:08.73
本も読めないヴァカ
0835デフォルトの名無しさん2013/03/14(木) 20:38:03.86
何故急に煽ったしww
0836デフォルトの名無しさん2013/03/14(木) 23:25:31.85
>何回も見なおしたのでコードの打ち間違いではありません。
0837デフォルトの名無しさん2013/03/14(木) 23:29:31.57
>>836
まあええやん
0838デフォルトの名無しさん2013/03/14(木) 23:49:00.89
>>836
まぁまぁw
0839デフォルトの名無しさん2013/03/14(木) 23:55:08.40
理由がわからないのに、自分の間違いではないと確信する雑魚は死んだ方がいい。
0840デフォルトの名無しさん2013/03/15(金) 00:05:58.73
初心者スレで煽ってるヤツこそ。
0841デフォルトの名無しさん2013/03/15(金) 01:17:44.86
その本がどういう書き方してるのか知らないが
内容的にループと文字出力の極初期の基本的なサンプルなんだから動作内容の説明があるだろうに
全く理解せずただ漫然と入力して結果だけ確認しようとしてる姿勢には眉を顰めるな
0842デフォルトの名無しさん2013/03/15(金) 05:33:45.76
おまえらプログラム1つ書けない初心者のくせして厳しいな
0843デフォルトの名無しさん2013/03/15(金) 09:11:43.60
初心者が文法などより先に覚えなければいけない鉄則

・自分が間違っている可能性が一番高い
・自分は間違っていないという判断が間違っている可能性が一番高い
・自分は間違っていないという判断は間違っていないという判断が間違っている可能性が一番高い
0844デフォルトの名無しさん2013/03/15(金) 09:28:38.57
思い込みが一番危険
自分のコードを読み返すときは書いたことを忘れて
一旦頭を真っ白にしてから読むこと
0845デフォルトの名無しさん2013/03/15(金) 09:29:36.03
ここはごく数人のヘタレどもがチンシコする糞スレです
うまく答えられないときはエラそうになんだかんだいちゃもんつけてきます
看板に偽りスレなので素人が質問しても時間の無駄です
わかったら相手にせず黙って去りましょう
0846デフォルトの名無しさん2013/03/15(金) 22:07:33.54
このスレわかりやすいです。ありがとうございます。
0847デフォルトの名無しさん2013/03/15(金) 23:04:43.32
初心者が初心者に嘘を教えるスレです
0848デフォルトの名無しさん2013/03/16(土) 09:54:42.90
良く読み返してみると、「教える側も、勘違いしている部分」も、
ないとはいえないわな。
0849デフォルトの名無しさん2013/03/16(土) 10:46:12.68
それはある意味あって当たり前だろ。
意図してウソ教えるのとは違う。
0850デフォルトの名無しさん2013/03/16(土) 11:20:21.58
初心者が初心者に上級者のフリして教えてたら
それはうそと言って良い
0851デフォルトの名無しさん2013/03/16(土) 12:09:50.18
姉は精神障害者
0852デフォルトの名無しさん2013/03/16(土) 12:39:59.19
俺は統合失調症
0853デフォルトの名無しさん2013/03/16(土) 15:23:00.13
弟は知的障害者
0854デフォルトの名無しさん2013/03/16(土) 20:54:35.81
兄は松崎しげる
0855デフォルトの名無しさん2013/03/16(土) 20:56:33.91
妹はヤンキー
0856デフォルトの名無しさん2013/03/17(日) 23:06:50.03
父は腎不全
0857デフォルトの名無しさん2013/03/18(月) 00:49:12.01
御前等歯1級精神障害者
マジで何のつもり?
0858デフォルトの名無しさん2013/03/18(月) 08:39:59.40
#include <stdio.h>
#include <time.h>
int main(int ac, char **av)
{
  time_t time;
  struct tm t, *l;
  t.tm_year = 2013 - 1900;
  t.tm_mon = 3 - 1;
  t.tm_mday = 18;
  t.tm_hour = 8;
  t.tm_min = 0;
  t.tm_sec = 0;
  time = mktime(&t);
  printf("%ld\n", time);
  l = localtime(&time);
  printf("%d-%02d-%02d %02d:%02d:%02d\n",
    l->tm_year + 1900, l->tm_mon + 1, l->tm_mday,
    l->tm_hour, l->tm_min, l->tm_sec);
  return 0;
}
これで 1363557600 2013-03-18 07:00:00 という結果になるのですが、
なぜ一時間ずれるのでしょう?
0859デフォルトの名無しさん2013/03/18(月) 09:49:21.61
普通はずれないと思うけどそれは謎だな
0860デフォルトの名無しさん2013/03/18(月) 10:28:57.20
サマータイムある場所?
0861デフォルトの名無しさん2013/03/18(月) 13:56:02.15
tm_isdstがクリアされてない。
0862デフォルトの名無しさん2013/03/18(月) 21:50:58.55
>>858
t.tm_mon を 7 とかにするとずれないね
0863デフォルトの名無しさん2013/03/19(火) 10:45:03.30
>7 とか
じゃなくて1から12までやってどれがずれてどれがずれないのよ。
って本人だよね?他にもずれる人いるの?
ずれてる人、PCの時刻設定でタイムゾーンどうなってる?
0864デフォルトの名無しさん2013/03/19(火) 11:29:18.27
>>861で解決でしょ。解決後にのこのこ出てきてボケる芸風?
0865デフォルトの名無しさん2013/03/19(火) 13:54:58.72
>>858
全部大文字で書け!
話はそれからだ。
0866デフォルトの名無しさん2013/03/19(火) 14:33:35.32
>>864
>>862はどうなんだ?
あと自分の環境でtm_isdstに何かセットして試してないだろ?
0867デフォルトの名無しさん2013/03/19(火) 14:51:39.61
時差9時\
0868デフォルトの名無しさん2013/03/19(火) 17:09:06.65
>>866
ずれる環境を用意できないゴミは参加資格なし。
0869デフォルトの名無しさん2013/03/19(火) 21:49:56.96
どうしてこう場外乱闘が好きなんだ。おまえら。
0870デフォルトの名無しさん2013/03/19(火) 21:51:38.82
>>858
Lと1の区別が付かないな。
大文字で書け。
0871デフォルトの名無しさん2013/03/19(火) 23:53:52.39
どんなフォント使ってんだw
■ このスレッドは過去ログ倉庫に格納されています