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

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
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/
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
0872デフォルトの名無しさん2013/03/20(水) 00:03:40.36
>>871
MS Pゴシック 12 pt
0873デフォルトの名無しさん2013/03/20(水) 13:08:26.88
アイコンをシステムトレイに格納する 方法をどなたかご教授いただけないでしょ うか? 使用環境はWindows7 HomePremium VC++2010 Express です。

d.hatena.ne.jp/peryaudo/20100512/1273671808 を参考にして書いてみましたが、 NOTIFYICONDATAが宣言されていな いと言われ、コンパイルが通りません でした。
0874デフォルトの名無しさん2013/03/20(水) 14:24:44.91
windows.hをincludeする前に、
#define WINVER 0x0501
とか入れるんじゃなかったっけ
0875デフォルトの名無しさん2013/03/20(水) 15:55:28.76
馬鹿には無理
0876デフォルトの名無しさん2013/03/20(水) 18:41:37.41
>>874
有難う御座います。自己解決しました。
0877デフォルトの名無しさん2013/03/20(水) 18:46:24.44
すげぇ・・・
08788772013/03/20(水) 18:46:54.36
いや、自己解決だから違う理由かw
0879デフォルトの名無しさん2013/03/27(水) 21:40:36.36
基底クラスと派生クラス両方のコピーコンストラクタ、代入演算子を呼び出すにはどのようにすれば良いのでしょうか
0880デフォルトの名無しさん2013/03/27(水) 22:23:33.36
はよ
0881デフォルトの名無しさん2013/03/27(水) 22:31:38.82
>>879
thisを基底クラス型にキャスト
0882デフォルトの名無しさん2013/03/27(水) 23:16:03.19
ちょっと待て
何がやりたいんだ?
0883デフォルトの名無しさん2013/03/27(水) 23:31:25.22
>>881
やはりそうするしかないのでしょうか
コンストラクタやデストラクタは派生クラスの側で明示的に書かなくとも良い
0884デフォルトの名無しさん2013/03/27(水) 23:41:09.62
誤って書き込んでしまいました
コンストラクタやデストラクタは明示的に書かなくとも良いのにという思いです

>>883
今回やりたかったのは、参照カウントを持った基底クラスを継承することでコピーを管理するというものです
例えばLast()という関数で参照カウントが1であることを確認してからリソースを開放するなど
もちろん継承を使わなければ実装できないものではありませんが、クラス名の横にごにょごにょ書くだけで済むなら便利かなと考えたわけです
0885デフォルトの名無しさん2013/03/27(水) 23:45:37.12
derived_class::derived_class(const derived_class& d) : base_class(...)
{...}

base_class::operator=(value);
0886デフォルトの名無しさん2013/03/27(水) 23:47:59.38
>>884
派生クラスのコピーコンストラクタから、基底クラスのコピーコンストラクタを呼び出したいと言うこと?
0887デフォルトの名無しさん2013/03/28(木) 00:10:47.14
はよ
0888デフォルトの名無しさん2013/03/28(木) 00:19:04.01
>>886
そういうことです
勝手に呼ばれるものだと思っていたのですが、どうもそういう訳ではないようですね

>>885
これでうまくいきました
コピーコンストラクタでもこの書き方が出来たのは知りませんでした

レスありがとうございました
コンストラクタは何も書かなくとも自動的に呼ばれるのに対し、コピーコンストラクタは派生クラス側で明示的に呼び出してやる必要があるということのようです
やや不思議ではあります
>>884に書いたことはコピーや代入は使わずに適当にAddRef関数でも作っときます
0889デフォルトの名無しさん2013/03/28(木) 00:31:01.98
はよ
0890デフォルトの名無しさん2013/03/28(木) 00:31:28.73
なんかとんちんかんなこと書いてるな…
参照カウントの値だかポインタだかを渡さないといけないのでコピーやらはしなければなりません
まあ何でもいいですね、質問の本旨でもないですし
0891デフォルトの名無しさん2013/03/28(木) 00:34:20.72
はよ
0892デフォルトの名無しさん2013/03/28(木) 09:48:07.28
最高の頭脳はこんなところで油を売ってる暇はないし
暇があったとしてもとっくに他のコミュニティに移動してる

こんな匿名の叩き煽りが日常茶飯事で自分にメリットが薄いようなところは
最高の頭脳でなくともまともな人間でもさっさと去るよ

他にコミュニティがない10年前なら最高の頭脳もいたかも知れないが、
いつの間にかいなくなって今ではその幻想だけが残ってる

最高の頭脳持ってる奴は他のコミュニティに行っても入っていけるから困らなかっただろう
そしてそういったコミュニティで相手にされない奴が集まってるのが2ch
0893デフォルトの名無しさん2013/03/28(木) 10:10:45.28
>>888
コンストラクタで自動で呼ばれるのは、デフォルトコンストラクタのみだけどね。
デストラクタは自動で呼ばれるけど、これは唯一にしか存在しないからだね。
c++は基本的に、全て明示するのが基本で、例外的にいくつかの自動があると思った方が良いよ。
0894デフォルトの名無しさん2013/03/28(木) 15:34:23.65
なんかとんちんかんなこと書いてるな…
0895デフォルトの名無しさん2013/03/28(木) 19:37:00.71
おい一つ上のスレッド開こうとしたらマウスがずれてこの開いただろうが糞スレ上げんな氏ねキチガイ
0896デフォルトの名無しさん2013/03/29(金) 02:02:02.08
VC++2010をVistaで使用しています

空のプロジェクトを作成した時に
ソース ファイル
リソース ファイル
ヘッダー ファイル
この3つのフィルタがデフォルトで作成されるのですが
デフォルトで作成されるフィルタが
Main
ProjectName
みたいにカスタマイズした状態で作成されるようにしたいです
デフォルトで作成されるフィルタを変更するにはどうすればいいですか?
0897デフォルトの名無しさん2013/03/29(金) 06:35:58.93
wizardの生成用jsファイルを自分の好みに応じて編集すればいい
0898デフォルトの名無しさん2013/03/29(金) 07:53:53.23
カスタムウィザードのキーにたどり着いたのでやってみます
ありがとうございました!
0899デフォルトの名無しさん2013/03/29(金) 12:25:27.41
Express Editionで>>897をやる事ってできる?
カスタムウィザード項目が無い
0900デフォルトの名無しさん2013/03/29(金) 14:40:56.74
検索能力が皆無のお前には無理
0901デフォルトの名無しさん2013/03/29(金) 17:56:46.48
>>899
できる
0902デフォルトの名無しさん2013/03/30(土) 02:58:10.24
>>901
ウィザードではなくて
default.js
Templates.inf
.vsdir
.vsz
これらを直接変更加えて追加したら出来ました
ありがとうございました
0903デフォルトの名無しさん2013/03/30(土) 14:35:55.54
構成プロパティにある作業ディレクトリをDefault.jsで指定するにはどうすればいいですか?
0904デフォルトの名無しさん2013/04/02(火) 01:21:39.22
Main.exeからA.dllを呼んでA.dllからB.dllを呼んだ場合
A.dllのエディットコントロールではキー入力が処理されるのに
B.dllでは処理されません
どうすればB.dllのエディットコントロールでもキー入力が処理されるようになりますか?
0905デフォルトの名無しさん2013/04/02(火) 02:33:56.94
TranslateMessageとDispatchMessageをちゃんと呼んでるか確認
0906デフォルトの名無しさん2013/04/02(火) 09:49:30.13
>>903
var config = proj.Object.Configurations('Debug');
config.WorkingDirectory = Path;
でいけるはずだがエラーになるな

Default.vcxprojに
<LocalDebuggerWorkingDirectory>Path</LocalDebuggerWorkingDirectory>
追加したらいい
0907デフォルトの名無しさん2013/04/02(火) 10:21:55.84
>>905
MainでTranslateMessageとDispatchMessageを呼んだら実現できました

さらにリターンキーでデフォルトボタンが押された動作にしたかったので
メッセージループ内でDLLダイアログハンドルを保持させるstatic変数を宣言
→DLL内でFindWindowを使用してMainウィンドウハンドルを取得
→ユーザーメッセージを使用してDLLからMainへダイアログハンドルを送信
→IsDialogMessageで通常通りの分岐
最終的にはこのような感じに落ち着きました
ありがとうございました
0908デフォルトの名無しさん2013/04/04(木) 17:55:52.74
今日の釣堀
http://itpro.nikkeibp.co.jp/article/Watcher/20130331/467401/
0909デフォルトの名無しさん2013/04/04(木) 18:54:58.46
VisualC++2008Expressです。

1つのソリューション内に2つのプロジェクト、A(exeプロジェクト)、B(DLLプロジェクト)を作ったとします。
AとBは同じモジュール(C++コード)を共有しており、Aでコンパイルした結果の.objをBのコンパイルでリンクさせたいとします。

このとき、対象となる共有モジュールをBでリンクさせるためには以下の方法があります。

方法1:
・プロジェクトAに共有モジュールをソリューションエクスプローラに登録
・プロジェクトBに共有モジュールをソリューションエクスプローラ上でプロジェクトAからコピーしてやる

方法2:
・プロジェクトAに共有モジュールをソリューションエクスプローラに登録
・プロジェクトBのプロジェクトのプロパティのリンカ設定で追加の入力から共有モジュールの.objファイルを指定する

なお、共有モジュールは複数あり、以後追加されていきますし、DLL化対象は都度変更します。
上記いずれの方法にしても、いちいちコピーやプロパティの変更が面倒です。
もし、プロジェクトAで生成された.objファイルを自動でリンクしてくれたら楽チンです。
ソリューションエクスプローラ上で複数のプロジェクトに共有(リンク)されるようにできる登録方法はないでしょうか??
プロジェクトの依存関係を設定(BがAに依存)するだけではダメでした。
0910デフォルトの名無しさん2013/04/04(木) 22:13:57.31
>>910
既にあるプロジェクトにリンク指定したいのか
新たに作成されるプロジェクトに初期値としてリンク指定したいのか
どっち?
0911デフォルトの名無しさん2013/04/04(木) 22:44:46.84
プロジェクトC(LIBプロジェクト)を作成し、そこに共有モジュールを登録する。
それが必要なプロジェクトにCへの依存関係を設定する。
09129092013/04/04(木) 22:53:29.64
>>910
前者のほう、既にあるプロジェクト間でのリンクです。

>>911
なるほど、その手がありますね。
明日会社でやってみます。
0913デフォルトの名無しさん2013/04/04(木) 23:00:25.13
その手がってより、王道だけどな。
0914デフォルトの名無しさん2013/04/04(木) 23:30:54.25
dllプロジェクトを作成してビルドする時に.expファイルとかのdll以外のファイルもdllと同じ場所に出力されるのが嫌なので
全般->出力ディレクトリ->
リンカー->全般->出力ファイル->
この2箇所を変更したのですが

warning MSB8012: TargetPath() が Linker の OutputFile プロパティ値 () と一致しません。
このため、プロジェクトが正常にビルドされない可能性があります。
この問題を解決するには、$(OutDir)、$(TargetName)、および $(TargetExt) の各プロパティ値が、%(Link.OutputFile) で指定されている値と一致することを確認してください。

と警告が出てしまいます
dllファイルとexpの出力場所を変更してさらにこの警告が出ないようにするにはどうすればいいですか?
#pragmaの警告無視以外の方法があれば教えてください
0915デフォルトの名無しさん2013/04/05(金) 00:49:02.08
ビルド後イベントに必要なファイルだけをどっか適当なところにコピーするバッチファイルでも仕込む。
0916デフォルトの名無しさん2013/04/05(金) 12:26:57.71
そういう手段しかないのですね
ありがとうございました!
09179092013/04/05(金) 20:19:11.56
>>911
できました!
理想通りです!
ありがとうございました!

>>913
勉強になりました!
0918デフォルトの名無しさん2013/04/17(水) 20:31:53.57
等高線グラフを表示させたいのですが、
手段が見つかりません。

3D点(x,y,z)の点(データ)×数万個を線で結びつけて、色付けしたものです。

チャートコントロール(mschar)では等高線をサポートしておらず、実現できません。
System::Windows::Forms::DataVisualization::Charting::Chart

どなたかご教授くださいませ!

[環境]
visual c++ 2008 express
vs2012へ更新検討中
0919片山博文MZパンク ◆0lBZNi.Q7evd 2013/04/17(水) 21:00:16.72
>>918
自分で描画したいなら、遠近法で(x/(z+α),y/(z+α))みたいにして奥の方から描画。OpenGLの方が簡単で無難。
0920片山博文MZパンク ◆0lBZNi.Q7evd 2013/04/17(水) 21:25:28.09
ピクチャコントロールのウィンドウハンドルを取得。
自前で描画する場合はウィンドウのDCを取得。
OpenGLで描画する場合はウィンドウにピクセルフォーマットを設定。
0921デフォルトの名無しさん2013/04/17(水) 23:17:56.11
>>919
>>920
書き込みありがとうございます。
遠近法、自前で描写、…難しそうです

変数->ADD(xの値,yの値,zの値);
変数->全ての点を線で結ぶ;
変数->zの値を元に色付けする;

っていうレベルで考えてます
OpenGLとかDirectXなら可能でしょうか?
0922デフォルトの名無しさん2013/04/17(水) 23:21:27.31
>>919
>>920
追加で…

ググってみたところ、Microsoft.Office.Tools.Excel.Char でグラフを作成できるのかな、
と思いました。(Excelだと等高線グラフを簡単に作成できるため)

Microsoft.Office.Tools.Excel.Charは何をするためにあるものでしょうか?
望みのことができますか?
できるなら、どのように導入(参照設定やら名前空間やらツールボックスやら)できますか?
レス数が900を超えています。1000を超えると表示できなくなるよ。