トップページ⇒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/
0497デフォルトの名無しさん2012/09/06(木) 04:13:40.82
>するとfoo1は呼び出しコストが高くなるので

え? 逆じゃないの?
プッシュはmuvより複雑で面倒な命令だから、実行時間が長くなるんじゃない?

試しに何回も呼び出しを繰り返させて実行時間を計ってみ?
0498デフォルトの名無しさん2012/09/06(木) 11:03:53.54
>>するとfoo1は呼び出しコストが高くなるので
>え? 逆じゃないの?
>プッシュはmuvより複雑で面倒な命令だから、実行時間が長くなるんじゃない?

すみません、おっしゃる通りでした。
以下のようにベンチしたところ、若干foo1呼び出しの方が速かったです。
http://ideone.com/2rTrd

コードが明らかに長くなるので、それだけ見て勘違いしておりました。

となると、サイズより速度を優先する最適化で、pushをmovに置き換える
コードが生成されないのはなぜですか?

また、((FOO1)foo2)(h);の行が入っていない場合、
foo2はfoo1に統合されませんでした。

しかも、関数自体はfoo1より、統合されないfoo2の方が速かったです。

謎だらけです。
0499デフォルトの名無しさん2012/09/06(木) 14:08:24.61
>>494
>>495
ありがとうございます。
なんとかできました。
できたはできたんですが、

自分が作りたかったプラグインはすでに存在してました orz
0500デフォルトの名無しさん2012/09/06(木) 15:42:04.15
構造体へのアクセスが単純変数へのアクセスよりも遅いって事だろ。

呼び出し時に構造体から変数に置き換えるか、関数内で置き換えるかの違いかと。
0501デフォルトの名無しさん2012/09/06(木) 15:59:16.26
えっ!?
0502デフォルトの名無しさん2012/09/06(木) 16:20:31.70
まあコンパイルは遅くなるかもなw
0503デフォルトの名無しさん2012/09/06(木) 21:38:56.41
構造体の変数を引数として渡して
関数内では構造体使わない方が速い

グローバル構造体宣言して使いまわすとか無しな
0504デフォルトの名無しさん2012/09/07(金) 14:46:45.00
質問ですが、VC++6.0にて
time_t time = time(NULL);
struct tm *ptime = localtime(&time);
として、YYYYMMやMM:DDのような書式にあわせた日付を取得する方法としてどのような方法があるのでしょうか?
YYYYと書式を設定したら2012、YYYY/MMと設定したら2012/09のようになるイメージです。

0505デフォルトの名無しさん2012/09/07(金) 16:52:48.33
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strptime.3.html
0506デフォルトの名無しさん2012/09/07(金) 16:55:36.66
>504
つ ttp://msdn.microsoft.com/ja-jp/library/fe06s4ak%28v=vs.90%29.aspx
0507デフォルトの名無しさん2012/09/09(日) 04:03:06.58
どんな構成でプロジェクト作ってる?
フィルタの振り分けとか

Main
->main.cpp
->main.h

ProjectName
->ProjectName.cpp
->ProjectName.h

自作外部ファイル用
->FileName1.cpp
->FileName1.h
->etc

こんな感じ?
0508デフォルトの名無しさん2012/09/09(日) 13:41:30.09
そう
0509デフォルトの名無しさん2012/09/10(月) 09:34:58.52
遅れて申し訳ありません。規制に巻き込まれてしまいました。
>>505 >>506
こんな関数があったんですね。わざわざURLまで貼っていただいてありがとうございます。
0510デフォルトの名無しさん2012/09/11(火) 21:03:25.31
すいません。
UDP通信の簡単なアプリケーションを作成中なのですが、
recvfrom()を実行するとデータを受信するまで終了できませんです。

0511デフォルトの名無しさん2012/09/11(火) 21:09:48.75
終了するまで自分にパケット送りつける事にすればいいでしょうか?
0512デフォルトの名無しさん2012/09/11(火) 22:12:18.61
ref クラスのプロパティに構造体の配列を持ちたいのですが、
混合型はサポートされていませんと出ます。
どうすればいいですか?
0513デフォルトの名無しさん2012/09/11(火) 22:47:17.96
C++/CLIを使う->間違い
C#を使う->正解
0514デフォルトの名無しさん2012/09/13(木) 17:53:59.24
MC Vsual C++6.0 をつかっています
ソフトがクラッシュすると、デッバッグが起動するんですけど
これを解除するにはどうすればいい?
0515デフォルトの名無しさん2012/09/13(木) 21:35:37.48
>>514
標準デバッガの設定だな。
XP以前だったらDrワトソンを標準デバッガに設定し直せば良い。
drwtsn32.exe -i
だったかな。いま7だから試せんわ。

もしOSがVISTA以降だったら、そもそもDrワトソンが無いので、レジストリの
HKEY_LOCALMACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug
を弄れは良い。
見て想像は付くと思うが、解らんかったらググれ。
0516デフォルトの名無しさん2012/09/13(木) 21:40:19.12
質問です。
VC++6.0を使用してtry catchで例外処理をしているのですが、VC++6.0ではVBのようにexceptionのような色々なエラーをキャッチできて、
詳細なエラーメッセージを取得することができる手段はないのでしょうか?
0517デフォルトの名無しさん2012/09/13(木) 21:52:41.37
例外を投げる時に詳細なエラーメッセージも一緒に投げればいいんじゃないかな
0518デフォルトの名無しさん2012/09/13(木) 21:59:51.79
いまざっとググってみたけど、その exception ってのが、VC で言うところの System::Exception なんじゃねぇの?
0519デフォルトの名無しさん2012/09/13(木) 22:36:46.06
ref Class
なにこれ??使いにくいぃぃぃいいいいい!!
皆さん使ってますか??
0520デフォルトの名無しさん2012/09/13(木) 22:37:29.82
C++CLIで下記のよなプログラムを書いてます。で下のエラーメッセージが出ました。

error C4368: cannot define '_test_main' as a member of managed 'NAMAI::Form1': mixed types are not supported
error C2678: binary '=' : no operator found which takes a left-hand operand of type 'NAMAI::TEST_main' (or there is no acceptable conversion)
could be 'NAMAI::TEST_main &NAMAI::TEST_main::operator =(const NAMAI::TEST_main &)' while trying to match the argument list '(NAMAI::TEST_main, NAMAI::TEST_main *)'

別ファイルのTEST_mainをフォーム1で生成したいのですが、エラーの解決方法を教えていただけないでしょうか。
よろしくお願いします。
>>HOGE.h
namespace NAMAI
{
class TEST_main { public: void TEST(void); };
}
>>Form1.h
#pragma once
#include "HOGE.h"

namespace NAMAI {
public ref class Form1 : public System::Windows::Forms::Form
{
public:
TEST_main _test_main;

Form1(void){
InitializeComponent();
InitializeTEST();
}
void InitializeTEST() { _test_main = new TEST_main; }
};
}
0521デフォルトの名無しさん2012/09/13(木) 23:07:34.35
C++/CLIはC++じゃありません
0522デフォルトの名無しさん2012/09/17(月) 17:23:05.36
>>521
じゃあなんあのさぁああああああああああああ!!!!!
0523デフォルトの名無しさん2012/09/17(月) 17:36:08.09
C++/CLIはC++/CLIだな、うん
0524デフォルトの名無しさん2012/09/23(日) 03:01:33.57
自前で_CrtSetDbgFlagの機能を実装するのってどんな考え方したらいいかな?
malloc/freeでfree忘れを検知するだけでいい

それができたらそこにGetDC/ReleaseDCとかも判定できるようにしようと思ってんだけど
0525デフォルトの名無しさん2012/09/24(月) 18:07:31.98
VC6の質問です

彼女が出来ません、どうしたら良いですか
0526デフォルトの名無しさん2012/09/24(月) 18:17:35.73
コードをかきまくります
0527片山博文MZボット ◆0lBZNi.Q7evd 2012/09/24(月) 18:59:17.08
>>524
プリプロセッサーでフック。
#define malloc mymalloc
...
atexit関数かstaticオブジェクトのデストラクタでチェック。
0528デフォルトの名無しさん2012/09/24(月) 19:10:38.89
__FILE__ __LINE__
0529デフォルトの名無しさん2012/09/24(月) 19:56:58.97
クラス定義でメソッドをインラインで書くとき
{} の後ろに ; が要らないのはなぜですか?
たとえば
class Hoge {
  int a;
public:
  Hoge() : a(0) {};
  ~Hoge() {};
  void Hage(void);
  void Fuga(void) {a=1;};
};
みたいなとき
class Hoge {
  int a;
public:
  Hoge() : a(0) {}
  ~Hoge() {}
  void Hage(void);
  void Fuga(void) {a=1;}
};
で良いんですよね?
だとすると逆に
  void Hage(void)
で怒られるのも謎
0530デフォルトの名無しさん2012/09/24(月) 20:02:56.43
関数の宣言と定義の違い
0531デフォルトの名無しさん2012/09/24(月) 20:04:29.16
>>529
関数書くときもいらないだろ
いつもわざわざ
void func() { };って書いてたのか?
0532デフォルトの名無しさん2012/09/24(月) 20:06:53.19
class は定義なのか宣言なのか } の後ろに ; が必要ですね。
0533デフォルトの名無しさん2012/09/24(月) 20:08:11.70
構造体には付けてただろ
0534デフォルトの名無しさん2012/09/24(月) 20:08:28.47
あれは宣言と同時にインスタンスを作れるようになってるから必要
0535デフォルトの名無しさん2012/09/25(火) 21:35:14.70
C++初心者の人はまず何から始めたほうがいいですかね?
0536デフォルトの名無しさん2012/09/25(火) 22:24:58.02
まず禊をして身を清め
断食で煩悩を断ってください
0537デフォルトの名無しさん2012/09/25(火) 23:31:20.62
>>535
興味のあるライブラリをさわってみる
サンプルをうごかしてみる
ちょっと変更してうごかしてみる
0538デフォルトの名無しさん2012/09/25(火) 23:44:32.53
>>537
やっぱり普通に言語の勉強するよりも動かしたほうがいいんですね
0539デフォルトの名無しさん2012/09/26(水) 08:21:09.71
if(hoge){huga;};
って書き方してるソースも見たことあるわ
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.10
必要ない
0543デフォルトの名無しさん2012/09/26(水) 14:03:10.45
仮にそこに渡されるポインタがNULLだとすると
既に別の例外が発生しているか
強制終了されている状況じゃないかな
0544デフォルトの名無しさん2012/09/26(水) 14:45:04.26
>>540
それよりお前
delete hoge;
し忘れてるぞ
0545デフォルトの名無しさん2012/09/26(水) 21:26:41.46
いや、それはこの際どうでもいいだろ。w

>>540
それって状況によるかも知れないから、どうしても心配ならこんな風に書いたりすることもある。
まあこれもどうでもいいかもしれんが。
printf("received exception: %s", hoge == NULL ? "NULL" : hoge );
0546デフォルトの名無しさん2012/09/26(水) 23:34:50.18
Visual C++ Expressを使用しています。64ビットでの開発をしようと
http://msdn.microsoft.com/ja-jp/library/9yb4317s.aspx
に書かれている通り行ったのですが、試しに sizeof(void*) を出力させたところ 4 となりました
これは通常だと8となるはずなのですがどうなのでしょう
0547デフォルトの名無しさん2012/09/26(水) 23:58:08.73
64bitのバイナリになってないんでしょう
0548デフォルトの名無しさん2012/09/26(水) 23:59:56.26
>>547
どうやって設定するのですか
0549デフォルトの名無しさん2012/09/27(木) 09:59:33.25
構成マネージャーでx64作成
0550デフォルトの名無しさん2012/09/28(金) 19:51:36.48
>>527,528
ありがとう
0551デフォルトの名無しさん2012/09/29(土) 10:04:12.90
ちょっと質問です。

VisualStudio 2010 で C++ を使い、Win32 アプリを作っています。
アプリ実行時に、IDE 上に任意のログを出力する機能ってありますでしょうか?

やりたいのは、Eclipse / Android 開発で、Log.e を Logcat で捕まえるようなものです。
リアルタイムで実行状況を確認したいときに使いたいです。
0552デフォルトの名無しさん2012/09/29(土) 10:17:37.47
OutputDebugString
05535512012/09/29(土) 10:47:50.91
いけました!ありがとうございます!
0554デフォルトの名無しさん2012/10/01(月) 02:46:20.20
SDKプログラムで、ボタンをオーナードローを使って描画しているのですが
Vistaや7のAeroのGUIで、ボタンにカーソルを合わせると徐々に青っぽくなって
カーソルをはずすと、また元に戻っていくようなアニメーションっぽいのを
やりたいんですが、この処理は自分でタイマー使ってやる以外に方法はありますか?
0555デフォルトの名無しさん2012/10/01(月) 04:51:11.16
自分でタイマー使ってやる
0556デフォルトの名無しさん2012/10/05(金) 12:04:40.08
printf の "%.*s" ってどういう意味ですか?
0557片山博文MZボット ◆0lBZNi.Q7evd 2012/10/05(金) 16:16:50.27
>>556 引数で最大表示文字数を指定する。
printf("%.*s\n", 4, "TESTTEST"); // TESTと表示。
0558デフォルトの名無しさん2012/10/05(金) 19:29:48.17
>>557
やさしさ乙
0559デフォルトの名無しさん2012/10/05(金) 20:13:25.32
thx!
0560デフォルトの名無しさん2012/10/05(金) 20:17:05.38
fgets() はどうして取得出来た文字数を返さないのでしょう?
0561デフォルトの名無しさん2012/10/05(金) 20:37:52.16
while(fgets(buffer, sizeof(buffer), fp) != NULL){
  hogehoge;
}
これだとバグ出るよね
0562デフォルトの名無しさん2012/10/05(金) 21:19:10.75
bufferの型によるな
sizeof(buffer) / sizeof(buffer[0])かポインタでなければ_countof(buffer)がいい
0563デフォルトの名無しさん2012/10/06(土) 16:03:54.56
> sizeof(buffer) / sizeof(buffer[0])

これって buffer が配列じゃなくてポインタのときは駄目じゃない?
0564デフォルトの名無しさん2012/10/06(土) 16:48:03.89
_countofなら大丈夫
0565デフォルトの名無しさん2012/10/06(土) 16:52:19.50
char *buffer = (char *)malloc(sizeof(char) * N);
printf("%d", _countof(buffer));
0566デフォルトの名無しさん2012/10/06(土) 16:58:29.23
>>565
ちゃんとコンパイルエラーになるから大丈夫
0567デフォルトの名無しさん2012/10/06(土) 17:14:27.83
char buffer[N];
○ 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
char *buffer = (char*)malloc(sizeof(char) * N);
× sizeof(buffer) / sizeof(buffer[0]) // コンパイルエラーにならなくて実行時誤動作
× _countof(buffer) // コンパイルエラーになるから大丈夫
0570デフォルトの名無しさん2012/10/07(日) 01:23:43.90
visual studioの仕様に慣れない初心者です・・・

次のエラーが解決できず、かなり苦労しています

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.25
glut32.lib
0572デフォルトの名無しさん2012/10/07(日) 01:59:53.67
glut.libの指定してる所はどう書いてる?
0573デフォルトの名無しさん2012/10/07(日) 02:05:55.88
       //
     /  /   バカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ 馬鹿には無理
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
0574デフォルトの名無しさん2012/10/07(日) 02:49:45.32
>>571
>>572
glut32.libがあるディレクトリを含めていませんでした!!
ありがとうございます、無事にコンパイルが通りました!!
0575デフォルトの名無しさん2012/10/07(日) 12:03:00.67
本当に初心者スレっぽくてなごんだ。
0576デフォルトの名無しさん2012/10/07(日) 15:19:15.62
「ごめん」って言うと
「遊ぼう」って言う。
「もう遊ばない」って言うと
「ごめんね」って言う。
そうして、あとでかわいそうになって
「遊ぼう」って言うと
「もう遊ばない」って言う。
こだまでしょうか?
いいえ、馬鹿には無理です。
0577デフォルトの名無しさん2012/10/07(日) 15:57:37.45
AH アーホー
0578デフォルトの名無しさん2012/10/07(日) 16:36:41.54
同じことをするプログラム(ソース)で
Cでコンパイルしたときと
C++でコンパイルしたときとでは
出来上がるプログラムのサイズは変わりますか?
0579デフォルトの名無しさん2012/10/07(日) 16:52:07.07
ありますん
0580デフォルトの名無しさん2012/10/07(日) 17:55:47.96
全く同じソースで?
リンケージの名前のつけかた違うからちょっとは違うだろうけど、、
0581デフォルトの名無しさん2012/10/07(日) 17:59:07.25
exe になったら一緒じゃないか
0582デフォルトの名無しさん2012/10/07(日) 20:06:38.43
その同じことをするための機械語プログラムのアルゴリズムは無数にあるだろ。
0583デフォルトの名無しさん2012/10/07(日) 20:52:56.23
最適化がどうかかるかとかあるだろ
0584デフォルトの名無しさん2012/10/07(日) 23:01:33.29
OSが同じとは書いてないな
0585デフォルトの名無しさん2012/10/08(月) 18:24:19.31
何でその疑問が沸いたのか、から書いてくれないと何と言っていいかわからんな
0586デフォルトの名無しさん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.40
逆に、
int *q = Hoge(N);
delete [] q;
で、正しく N 個の要素を削除出来る仕組みが(確保されたオブジェクトの方とかに)あるのなら、
そもそも、
delete q;
と書いても大丈夫のような気がするのです。
0588デフォルトの名無しさん2012/10/10(水) 13:47:13.04
age 忘れました。
よろしくお願いします。
0589デフォルトの名無しさん2012/10/10(水) 13:49:58.26
[] つけないとデストラクタが最初のやつしか呼ばれない
試して味噌
0590デフォルトの名無しさん2012/10/10(水) 13:50:28.58
アセンブラ吐いてみたら?
0591デフォルトの名無しさん2012/10/10(水) 13:51:41.94
>>589
それは判るんです。
疑問点は [] があるときは要素数がなぜ判るのか?って所です。
0592デフォルトの名無しさん2012/10/10(水) 13:55:23.89
そんなもんわかる様に作ってあるからだろ。
ほんとの疑問点は、配列だとわかってるくせに
なぜ [] を指定しないとちゃんと呼んでくれないの?

じゃないのか?
0593デフォルトの名無しさん2012/10/10(水) 13:56:55.44
int *p = new int[n];
するとp[-3]あたりに確保した要素数が入ってあったり
0594デフォルトの名無しさん2012/10/10(水) 13:59:54.45
>>590
やってみます。

>>593
それが出来るなら、delete p; でも良いような気がしてるんです。
0595デフォルトの名無しさん2012/10/10(水) 14:01:41.88
実行時に配列かどうか確かめなきゃならんのは無駄だろう
0596デフォルトの名無しさん2012/10/10(水) 14:01:46.27
>>592
>>593
あと、sizeof(p) とかは動的な場合は取れない(コンパイルエラー?)ですが、
「本当は判る。」ってことになりますよね?
0597デフォルトの名無しさん2012/10/10(水) 14:02:32.11
>594
じゃあ一個だけ消したいときはどうすんの?
■ このスレッドは過去ログ倉庫に格納されています