【初心者歓迎】C/C++室 Ver.64【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.64【環境依存OK】 - 暇つぶし2ch1:デフォルトの名無しさん
09/02/10 00:25:51
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
スレリンク(tech板)

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


2:デフォルトの名無しさん
09/02/10 03:24:45
C++のコードから、ファイルをオープンするときに、
ウィンドウを開いてユーザーにディレクトリを選ばせて、そこから
ファイルを開くようにしたいのですが、どう書けばよいですか?
しょぼい質問ですいませんがお願いします


3:デフォルトの名無しさん
09/02/10 03:35:20
C#だったら簡単だよ。

4:デフォルトの名無しさん
09/02/10 04:01:04
そんなこといったら全部C#で書けばもっと楽だろうけどなw

5:デフォルトの名無しさん
09/02/10 07:43:22
全角空白か 

6:デフォルトの名無しさん
09/02/10 09:50:58
他クラス型のメンバをprivateで持つ際、
ヘッダでのクラス宣言時にそのクラスのヘッダまでインクルードして
外に見せているのが違和感あるのですが、これは仕方の無いことなのでしょうか?

それとも、ヘッダでは最初に
class COther;
と宣言だけしておいて、
private:
  COther* m_pOther;
とポインタでメンバを定義して、ヘッダはソース内でインクルードして
実体はコンストラクタでnewするとかの方法のほうが
よく使われるものなのでしょうか?

7:デフォルトの名無しさん
09/02/10 10:39:22
>>6
こういう話か?
--OtherClass.h
class OtherClass {
};
--SomeClass.h
#include <OtherClass.h>
class SomeClass {
OtherClass member;
};
--
だとしたら、使う方は#include <SomeClass.h>だけで済むがそれの何が不満なんだ?

8:デフォルトの名無しさん
09/02/10 10:41:39
>>6
pimplイディオムだな

9:デフォルトの名無しさん
09/02/10 10:53:06
>>7
たとえばクラスをエクスポートするライブラリを作る場合、
そのクラスのメンバに使っているクラスもエクスポートする必要が出てきます。
privateで使っているだけで、利用者側には全く関係無いクラスなのに、
なんでそれらまでエクスポートしなくてはいけないのかと思いました
(カプセル化できてないのではと思いました)。

>>8
この単語は初めて知りました。
さっそく検索してみます。

10:デフォルトの名無しさん
09/02/10 12:49:30
基本クラスの純粋仮想メンバ関数を継承クラスで仮想なしで実態を作った場合、
その継承クラスを継承したクラスでオーバーライドすることはもうできないんでしょうか?

11:デフォルトの名無しさん
09/02/10 12:54:11
派生クラスでvirtual付けようが付けまいが
基本クラスでvirtualならオーバライドしたものもvirtual

12:デフォルトの名無しさん
09/02/10 19:50:17
>>9
インタフェースクラスを作って、
実際にはその実装クラスを new して返す
static メンバ関数を用意する、という手法もある。

// IA.h
class IA {
public:
 static IA* Create();
 virtual ~IA() { }
 virtual void Hoge() = 0;
};

// IA.cpp
#include "IA.h"

class A : public IA {
public:
 virtual void Hoge() { /* ここで実装 */ }
};

IA* IA::Create() { return new A; }

こっちはメンバへのアクセスが楽だという利点と、
public メンバ関数を追加するのが面倒臭いという欠点がある。

13:デフォルトの名無しさん
09/02/11 02:20:51
if( a == b && c == d )
でa == bの時点でもうどっちに分岐するか結果出てると思うんですが、この場合c==d計算されないんですか?
if(a==b){
 if(c==d){}
}
こう書いた方が安全ですか?もしa==bがFalseの場合c==dを評価するとエラーになる場合なんです

14:デフォルトの名無しさん
09/02/11 02:26:08
>>13
C / C++ において && の左辺が偽なら右辺は評価しないことは
保障されてる

一応例外として、 &&演算子がオーバーロードされてればその限りではない

15:デフォルトの名無しさん
09/02/11 02:30:57
どうもです

16:デフォルトの名無しさん
09/02/11 02:37:45
型ごとに処理を書いてるんですが、どうしてもテンプレートで書けそうもありません。
そんな状況ってありえますか?頑張っても無理な場合はあるんでしょうか?
//class A
vector< int> vInt;
vector< double> vDouble;
BOOL flag;

//class B
void func(){
 if(A::flag==0){
  A::vInt.resize(0);
 }else{
  A::vDouble.resize(0);
 }
}

このflag値での分岐内の処理がダブってるのを何とかしたいんです

17:デフォルトの名無しさん
09/02/11 02:39:22
A::flag==0がコンパイル時に決まる条件ではないなら、無理。

18:デフォルトの名無しさん
09/02/11 02:48:48
ダブってるコードが大量にあるなら
テンプレート関数にすれば?

19:デフォルトの名無しさん
09/02/11 03:06:00
そうすると今度は引数としてどう渡せばいいのかがわからなくなってしまったんです

// class A
if(flag==0){ // .hに書けないので.cpp
 vector< int> vData = new vector<int>(); // new の書き方が不明
}else{
 vector< double> vData = new vector< double>();
}

// class B
template <typename T>void Func(T, vData){
 vData.resize()
}

20:デフォルトの名無しさん
09/02/11 03:09:32
はぁ? 16 と 19 意味が全然違ってるジャン

21:デフォルトの名無しさん
09/02/11 03:14:08
型ごとに処理って話ならそもそも

template<typename T>
void func(T t)
{
t.resize(0);
}
じゃだめなの?

22:デフォルトの名無しさん
09/02/11 03:52:05
class A{
union {
vector <int> _i(10);
vector <double> _d(10);
} u;
int flag; // 0 or 1
template<T> f0(T u);
void f1(){f0(u._i); ~;};
void f2(){f0(u._d); ~;};
void (*f[2])() ={ f1, f2};

void pub(){ (*f[flag])();};
}
19 実現はテンプレ関係なしバージョンで十分

23:デフォルトの名無しさん
09/02/11 04:08:29
すごいwハイレベルすぎる
ありがとう

24:デフォルトの名無しさん
09/02/11 05:29:22
>>22
vectorは共用体に入れられない

25:デフォルトの名無しさん
09/02/11 06:17:08
継承の根底クラスポインタを使った振り分け
B→A:B{<int>}, C:B{<double>}
D{B *b; D(f){f?b = new A: b = new B;}; };

26:デフォルトの名無しさん
09/02/11 12:04:43
>>25
俺なら D を用意する変わりに factory 作るだろうな。
そんで map<key, factory> みたいなので get して Create()。

27:デフォルトの名無しさん
09/02/11 14:24:46
そもそも実行時の型判断を望んでるのかどうか本人が理解してないのかも
もしかしたらテンプレートクラスで済む話なのかもしれない。

28:デフォルトの名無しさん
09/02/11 14:29:09
つか、フラグで使い分けるような、int配列と double配列を
一つのクラス内に持たせていることが疑問。
設計がおかしい。

29:デフォルトの名無しさん
09/02/11 14:55:48
int func(int a)
{
if(a>10)
a=10;
return a+1;
}
のように引数で渡された変数を変更しても問題ありませんか?

30:デフォルトの名無しさん
09/02/11 14:59:21
>>29
大丈夫

31:デフォルトの名無しさん
09/02/11 20:01:43
>>29
大丈夫ではあるけど、
関数内で二度と a の元の値を使えなくなってしまうので注意。
後になって処理を追加した際に、
途中で値が変更されてるのを忘れて処理を追加して
上手く動かねーとかなるといけないから、
なるべくなら別変数を作った方が好ましいし、
それでも a を変更したいんだ!ってんなら、コメントでも残しておくといい。

32:デフォルトの名無しさん
09/02/11 20:28:26
>>30-31
ありがとうございます

33:デフォルトの名無しさん
09/02/11 21:19:28
int func(int& a, int* b = &a)
{
if(a>10)
a=10;
return *b++;
}


34:デフォルトの名無しさん
09/02/11 21:44:16
int func(const int a){ return (a>10)? 10+1: a+1; }

wwww


35:デフォルトの名無しさん
09/02/13 23:05:14
急に過疎ってどうしたんだ?

36:デフォルトの名無しさん
09/02/13 23:29:01
春だからさ・・・・・

37:デフォルトの名無しさん
09/02/14 02:10:04
Cとgrassのハイブリッド言語かと思った。

38:デフォルトの名無しさん
09/02/14 02:43:26
grass と 常用単語の堺は3文字あたりから?

void fp(int (*s)[8]);
void fr(int& s[8]);

any(){
int s[8];
int sx[32][8];
int* sp[8];
int* sxp[32][8];
int o[16];
enum{a...b=32}x;

fp(&s);
fp(&(sx[x]));
fp(sp);
fp(*(sxp[x]));
fp(&((int*[8])o));
fr(s);
fr(sx[x]);
fr(*sp);
fr(**(sxp[x]));
fr(*((int*[8])o));
}
どっかに考え方が判り易くまとまった資料ない?
正解不正解はコンパイル通してみるまで判らない自分。


39:デフォルトの名無しさん
09/02/14 03:23:09
windowsアプリケーションなんですが
Borland C Compiler 5.5にて
MAKELONGマクロが警告にひっかかってしまいます。
windef.hの定義を見るに括弧が足りないのが原因のようです。
これは単純にwindef.hのミスですか?BCCのミスですか?私の設定ミスですか?

40:デフォルトの名無しさん
09/02/14 07:52:34
>>39
windef.hのミスだね
本家のWinDef.hは括弧が多かった
#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))


41:デフォルトの名無しさん
09/02/14 07:55:25
調べなおしてみたらVC+2008EEに付属のSDKは括弧が多かったが昔のPlatformSDKのは少なかったわ


42:39
09/02/14 11:12:03
>>40-41
ありがとうございます。
MAKELONGを(あとMAKEWORDも)
#undefして括弧増やした#defineしなおしてもいいもんでしょうかね?

43:デフォルトの名無しさん
09/02/14 11:43:07
>>42
しなおしてもいいし大元のファイルを修正してもいいし警告無視してもいいよ
簡単にすると( A | B << 16 )ってなるから ( B )に括弧が必要というわけか



44:43
09/02/14 11:45:56
( B << 16 )に括弧が必要
の間違いでした

45:39
09/02/14 12:34:59
>>43-44
どうもでした。

46:デフォルトの名無しさん
09/02/15 08:59:26
LPTSTRを使って
char hoge[40];
みたいな固定長の、文字を入れておける場所を定義するのって出来ますか?


47:デフォルトの名無しさん
09/02/15 09:13:07
TCHAR s[40];
がいいかな

48:デフォルトの名無しさん
09/02/15 09:18:16
ありがとうです。
それでできました!


49:デフォルトの名無しさん
09/02/15 09:24:24
もう一個だけ質問させてください。
_T("ddd");
TEXT("ddd");
これって書き方が違うだけで同じですか?


50:デフォルトの名無しさん
09/02/15 09:39:22
同じ。
強いて言うなら、前者はCライブラリの拡張で、後者はWin32。
ちなみに前者のバリエーションで_TEXTもある。

51:デフォルトの名無しさん
09/02/15 23:26:08
ありがとうございます。なるほど。
TCHARとかLPTSTRとかにあわせて、TEXT("")を使います。


52:デフォルトの名無しさん
09/02/15 23:33:30
背景とカーソルを同時に表示しようと思うんですが、
その画像をまとめてメモリデバイスコンテキストに選択して、
「最終的に表示する画面」を先に作る方法が分からないので、
どなたか教えていただけないでしょうか。

環境は WinAPIです。

よろしくおねがいします

53:デフォルトの名無しさん
09/02/16 00:09:31
それはカーソルじゃなくてキャレットのことかね?

54:デフォルトの名無しさん
09/02/16 00:45:17
関数の引数に関数を渡すことはできませんか?
処理の途中で指定した関数を入れたいんです。

55:デフォルトの名無しさん
09/02/16 00:46:34
>>54
関数ポインタというのがあってだな

56:デフォルトの名無しさん
09/02/16 00:51:08
thx出てきました!

57:デフォルトの名無しさん
09/02/16 01:02:45
// class A
void Func(){}
X.pfFunc = Func;

// class X
void (*pfFunc)();
void Shori(void pfFunc()){
(*pfFunc)();

これどうやって引数に渡す時と、使うとき書けばいいですか?



58:デフォルトの名無しさん
09/02/16 01:09:27
>>53
すいません言い方が悪かったです

画像2枚だと考えてください
背景の画像と 矢印の画像です。

よろしくおねがいします

59:デフォルトの名無しさん
09/02/16 01:51:58
>>58
WinAPIスレにでもどうぞ。

>>57
メンバ関数は普通の関数ポインタとは振る舞いが異なるので注意。
「メンバ関数のポインタ」とでもして、検索してみることをお勧め。

60:デフォルトの名無しさん
09/02/16 03:19:29
コンストラクタってパブリックにしないとだめですよね?
newするときアクセスできないとか言われるんですが、内部でよんでくれるんじゃなかったんですか?

61:デフォルトの名無しさん
09/02/16 03:53:17
ポインタは使い終わったらNULLしたほうがいいんですか?
NULLしないでポインタを持っていたクラスをdeleteしたらポインタがゴミとして残るんでしょうか?
というかそうしたら変数も解放しなきゃいけないのですか?どうやんお?

62:デフォルトの名無しさん
09/02/16 04:04:37
>>61
NULLするってなんだよ?

63:デフォルトの名無しさん
09/02/16 04:08:33
>>61
どうやんお? でちょっと笑た

ポインタとメモリの動的確保についてもーちょい学ぶべき
NULLするってのはNULL入れるってことかい

64:デフォルトの名無しさん
09/02/16 04:12:26
ポインタはオマエ自身から持つ手綱
データはペットの犬
手綱は他人のペットにも付けられるが そのペットは苦しい。

自分の飼っている犬の手綱はポイチョと捨てると他人に迷惑だが
他人のペットに付けた手綱はポイチョと捨ててもあまり問題にはならない。
他人のペットも譲られて唯一の飼い主がオマエになればオマエに責任が

65:デフォルトの名無しさん
09/02/16 04:22:53
難読Cコンテストを思い出した

66:デフォルトの名無しさん
09/02/16 04:28:14
メンバ関数ポインタは入れる時と使うときクラス名が必要なことがわかりました!
これじゃあライブラリとして使えなく無いですか?
設計を見直せですか?

67:デフォルトの名無しさん
09/02/16 04:29:23
定数へのポインタは渋谷のハチ公に首輪をつけるようなもの
全くの無意味ではないが楽しく一緒に遊んでくれない。

土佐犬にチワワ用の首輪を付けても首じゃなく足首に掛かったりして土佐犬を転ばせたりする。
だからと言ってロデオロープ的な void * で括ってアチコチ引き回したら犬が昇天する場合もある

68:デフォルトの名無しさん
09/02/16 04:37:03
やばい
全く集中できなくなった

69:デフォルトの名無しさん
09/02/16 05:07:23
関数の中で
static int a = 0;
とした場合このaは関数を抜けても保持されるんでしょうか?
起動時最初の一回しか変数が存在しないことになるんでしょうか?

70:デフォルトの名無しさん
09/02/16 05:38:57
>>69
スコープがブロック内に限定されてるだけで、他はグローバル変数と同じと言える

だからアドレスを渡して関数外からアクセスしようが問題ない



71:デフォルトの名無しさん
09/02/16 06:06:42
ありがとうございます!!!
>>60>>61>>66
もお願いします!

72:デフォルトの名無しさん
09/02/16 06:50:02
構造体の配列を引数に渡して使うにはどうすれば書けばいいでしょうか

structA a[] = { { 1, 2, }, {3, 4,}, };

//ClassX.h
Class* Z;

//ClassX.cpp
Z = new ClassZ();
Z->func(a);

//ClassZ.h
void func(structA bufa);

//ClassZ.cpp
func(structA bufa){
sizeof(bufa);
}

このときsizeofで帰ってくる値はどういう値ですか?

73:デフォルトの名無しさん
09/02/16 06:57:12
>>72
structAが何バイトか(C99だとそういいきれないけど別にいいだろう)


配列渡すなら

void func(structA bufa[]);
//ClassZ.cpp
func(structA bufa[]){
sizeof(bufa);
}

とでもすればいい、ただしこれは

void func(structA *bufa);
//ClassZ.cpp
func(structA *bufa){
sizeof(bufa);
}
と等価なのでsizeof(bufa)はどちらもポインタのサイズになる(配列のサイズではない)

74:デフォルトの名無しさん
09/02/16 07:12:22
構造体の各値がintだとすると
{ { 1, 2, }, {3, 4,}, }

4個*4バイト=16バイト
が返るようにするにはどうすればいいですか?

[]付けたんですけど
funcの中で

structA b[];
b = bufa;

としたらstructA[]からstructA[]に変換できませんとでるんですがこれはどうなおせばいいでしょうか

75:デフォルトの名無しさん
09/02/16 07:24:43
structA b[100];
bに代入はできない
b[0] = とかはできるけど


76:デフォルトの名無しさん
09/02/16 07:27:03
>>66
C# の delegate を参考にしてみれ。

class delegate {
public:
 virtual ~delegate() { }
 virtual void operator()() = 0;
};

template <typename T>
class delegateT : public delegate {
public:
 typedef void (T::*Mfn)();
 delegateT(T* obj, Mfn mfn) : m_obj(obj), m_mfn(mfn) { }
 virtual void operator()() { (m_obj->*m_mfn)(); }
private:
 T* m_obj;
 Mfn m_mfn;
};

77:デフォルトの名無しさん
09/02/16 07:31:00
boost::bind.hpp
boost::function.hpp
を使うとか


78:デフォルトの名無しさん
09/02/16 10:57:01
>>75
C++でも出来ないとこってあるんですね
サイズは送り元で計算して引数は増えますが一緒におくることにしました。
受取側の関数で構造体の配列変数を除くと1つ目の構造体しか表示確認できなかったんですが、
サイズを添え字にして強引?に全配列をプログラム実行の中で処理できました。
が、これ保障されてますか?安心してこういう使い方して大丈夫なんでしょうか?

79:デフォルトの名無しさん
09/02/16 12:11:20
C#の中のコード全然意味わかりません
boost調べたら簡単にできました。
ありがとうです!

//classA
CC* pC;
CB* pB;
pB->Func(bind(&CC::Update, ref(pC)));

//classB
void CB::Func(function<void ()> f_buf)
{
f_buf();
}

// classC
void CC::Update(){}

80:デフォルトの名無しさん
09/02/16 12:38:17
いややっぱりなにも進展してませんでした
function<void ()> f_buf

function<int ()> f_buf
だったり
function<bool ()> f_buf
だったりした場合、汎用ライブラリにしたとして、使うたびに修正しないとだめじゃないですか?
メンバ関数ポインタと結局同じなことに気づきました・・・

81:デフォルトの名無しさん
09/02/16 12:39:55
operator()()
これはどういう意味なんでしょうか

82:デフォルトの名無しさん
09/02/16 12:49:04
>>81
関数オブジェクトでぐぐったら使い方含めてわかるかもよ

83:デフォルトの名無しさん
09/02/16 13:16:23
>>60
こういう風にnewとprivateなコンストラクタを組み合わせる技法は存在する。
class Hoge
{
public:
static Hoge* Craete(int x) {return new Hoge(x);}
private:
Hoge(int);
}

84:デフォルトの名無しさん
09/02/16 13:19:07
出来そうな気がしてきました。
実行したい処理を()演算子の中に作ったクラスを型にした変数を引数として渡せば、
クラスの変数();
とすれば処理が実行されるということですね
ありがとうございました。

85:デフォルトの名無しさん
09/02/16 13:20:31
>>80
実は、function<int ()>型やfunction<bool ()>型からfunction<void ()>型へ変換できる。
戻り値を見ないなら全部function<void ()>型にすればいい。

86:デフォルトの名無しさん
09/02/17 16:24:20
sprintfの逆のことをしたいのですがそういう関数なかったでしょうか?
char str[]="年齢は10,性別は男";
例えば、(str,"年齢は%d,性別は%s",age,sex)の引数が与えられると
age=10,sex=男が得られるようにする関数です。
よろしくお願いします。

87:デフォルトの名無しさん
09/02/17 16:26:24
sscanf のこと?

88:デフォルトの名無しさん
09/02/17 16:40:27
>>87
それです。^^;
あったような気がしていたのですがprintが
入っている名前の関数だと思い込んで探していました。
助かりました。ありがとうございました。

89:デフォルトの名無しさん
09/02/18 11:39:57
コールバック関数が今だに理解できないです。教えてください。

90:43
09/02/18 11:43:30
>>89
関数ポインタはわかるか

91:デフォルトの名無しさん
09/02/18 12:00:21
わかります。
void Func(){}
void * f = Func;
(*f)();

92:デフォルトの名無しさん
09/02/18 12:03:45
オブジェクトを作成するアプリケーションのインスタンスハンドルが必要だとヘルプに書いてあるんですが
この場合thisを入れればいいんですか?

93:43
09/02/18 12:22:54
>>91
コールバック関数のポインタを引数にして渡す
#include <stdio.h>

/* callback用関数 1*/
int add(int a, int b)
{
return a+b;
}
/* callback用関数 2*/
int sub(int a, int b)
{
return a-b;
}
void func(int (*callback)(int, int))
{
int x = callback(1, 2);
printf("%d\n", x);
}
int main(void)
{
/* "addへコールバックしてね" */
func(add);
/* "subへコールバックしてね" */
func(sub);
return 0;
}


94:デフォルトの名無しさん
09/02/18 12:26:57
>>92
状況によるだろう。
でもハンドルと書いてあるからthisはないと思うよ。
なんとなく、hInstanceいれるとこみたいだが。

95:デフォルトの名無しさん
09/02/18 12:38:56
>>93
ありがとうです!
その場合CALLBACKがつくのはどれなんでしょうか
メンバ関数もコールバックとして渡せるんですか?

96:デフォルトの名無しさん
09/02/18 12:41:45
Win32アプリの
LRESULT CALLBACK WndProc
はまた別物ですか?

97:デフォルトの名無しさん
09/02/18 14:22:14
WaitForSingleObjectは普通マルチスレッドで使うんですよね?
勝手に別スレッドで待機して制御は返す仕組みじゃないですよね?

98:デフォルトの名無しさん
09/02/18 14:25:43
まあそうだが、シングルスレッドでもオブジェクトがシグナル状態か確認する時も使う。

99:デフォルトの名無しさん
09/02/18 14:43:22
>>96
CALLBACKがどう#defineされてるか見てみるといい

100:デフォルトの名無しさん
09/02/18 14:49:12
gdb 用のGUI ツールお勧め教えて
class 関連 CUI じゃツライす

101:43
09/02/18 16:26:59
>>95
コールバックをする関数の引数に定義された型と同じ関数(戻り値の型と引数の数、型が同じ関数)を作ってその関数名を渡せばいいんだよ
メンバ関数は呼び出し規約(CALLBACK = stdcall)が違う(thiscall)かもしれない

102:デフォルトの名無しさん
09/02/18 17:09:50
>>96
そのコールバックは、引数の処理をどうするか、という指標なんであまり気にしなくて良いと思う

103:デフォルトの名無しさん
09/02/18 20:51:27
struct V4 {
 union {
  struct { float x, y, z, w; };
  float m[4];
 };
};
と書いた時、
xのアドレス == &m[0] 、yのアドレス == &m[1]、 …
になったのですが、これはどんなコンパイラでやっても同じ様になるんでしょうか?

104:デフォルトの名無しさん
09/02/18 21:43:59
xのアドレス == &m[0]だけは保証されてる
あとはコンパイラ次第

105:デフォルトの名無しさん
09/02/18 21:45:58
>>96
LRESULTは戻り値の型、>>91でのvoid、
WndProcは関数名、>>91でのFuncにあたる。
CALLBACKは他の人の言うとおり。

106:デフォルトの名無しさん
09/02/18 21:46:44
キーボード押しっぱなし時のWM_KEYDOWNは、一回発行された後に
少し時間を置いてから連続で発行されるんですか?

キーボードからの入力でキャラクタを動かしているのですが、
キーボードおしっぱ→キャラクタが1ループ分動く→コンマ数秒無反応
→キャラクタが連続で動く、となってしまいます。

ゲームのキャラクタみたいにキーボードを押すとすぐに連続で動作してくれる
処理をしたいのですが・・

107:デフォルトの名無しさん
09/02/18 21:53:06
>>106
GetAsyncKeyState

108:デフォルトの名無しさん
09/02/18 22:08:17
>>107
こんな便利なものが・・・
ありがとうございます。

109:デフォルトの名無しさん
09/02/19 04:45:06
マルチスレッドの関数はグローバル領域に作ったほうがいいですか?
クラスの中に入れるとめたくそ難しいんですが

110:デフォルトの名無しさん
09/02/19 05:12:32
難しいと思うのならクラス内に作らなくても構いません。

111:デフォルトの名無しさん
09/02/19 05:24:48
なんでメンバ関数だとコンパイルできないんですか?
静的関数ならいんでしょうか

112:デフォルトの名無しさん
09/02/19 05:34:41
そりゃぁ、スレッド生成するAPIがクラスに対応してなければインスタンスへのポインタ(this)を渡せませんから。
thisを伴わない静的メンバ関数ならAPIから呼べますから、コンパイルもできるはずです。

まぁ、環境も書かなきゃエラーメッセージも書かないということは、詳しい説明は要らないのでしょうし、この辺で。

113:デフォルトの名無しさん
09/02/19 05:55:23
いやいります。見捨てないでください

AfxBeginThread(CView::Proc, this);

//h
static UINT __cdecl Proc( LPVOID pParam );
static UINT __cdecl ProcAfter( LPVOID pParam );

//cpp
UINT CView::Proc( LPVOID pParam )
{
 CView *const this_ptr = (CView *)pParam;
 return this_ptr->ProcAfter();
}
UINT CView::ProcAfter( LPVOID pParam )
{
 //実際にマルチスレッドで実行したい処理
}

なぜこう書かないといけないのかが理解できません。直接
AfxBeginThread(CView::ProcAfter, this);
こうしたいんですが、エラー出まくります。&CView::ProcAfterにしろとか、やっても仮想関数だとかになるんです。
Afxじゃくても_beginthreadexでも同じなんです。マルチスレッドをクラスのメンバでやるのはそうとう強引で特殊ですか?

114:デフォルトの名無しさん
09/02/19 06:19:42
>>113
にほんごよめますか?

>112
>まぁ、環境も書かなきゃエラーメッセージも書かないということは

115:デフォルトの名無しさん
09/02/19 13:37:43
Win32アプリのメッセージループ内で独自の処理をする時クラスのインスタンスとかを作るのはどこがいいんですか?
ループに入る直前でいいんですか?いろいろなところにここにコードを追加してくださいとか書いてあるので不明です

116:デフォルトの名無しさん
09/02/19 13:42:45
#define _T("test.txt") fileName
マクロの仮パラメータリスト内に予期せぬ文字列がありますのエラーが出ます。
どう書けばいいんですか?

117:デフォルトの名無しさん
09/02/19 13:56:14
あきらかに変だがどう使いたいわけ?

118:デフォルトの名無しさん
09/02/19 14:19:28
文字を置き換えたいだけです。
プログラム中のどこだかわからなくなるので
先頭に置いてファイル名を変えられるようにしたいんです

119:デフォルトの名無しさん
09/02/19 14:38:07
だったら逆だろ?
#define filename _T("test.txt")

120:デフォルトの名無しさん
09/02/19 14:56:56
逆でしたか!どうもです

121:デフォルトの名無しさん
09/02/19 17:46:10
>>113
(非静的な)メンバ関数は普通の関数と違い、&演算子を使わないとメンバ関数へのポインタを得られない
という点はエラーメッセージの言うとおり。

そうやってメンバ関数へのポインタを得たところで、>>113のようにできないわけは、
メンバ関数へのポインタは、普通の関数へのポインタとは中身が異なっているため。
その主な理由は、仮想関数にもきちんと対応しないといけないことから。

メンバ関数を直接渡せるようにしたければ、自分でそういう関数を作ればいいじゃない。

122:デフォルトの名無しさん
09/02/19 17:47:35
というわけでやってみた。普通は関数オブジェクトを引数にすべきだろうけど。改行制限厳しい。VC++ 2008。SP1ならもう少し簡単になる。
#include <utility>
#include <memory>
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <atlbase.h>
class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}};
template<typename T>
UINT __stdcall beginthread2_entry(void* p) {
  typedef std::pair<T*, UINT (T::*)()> thread_data_t;
  thread_data_t* ptd = static_cast<thread_data_t*>(p);
  T* px = ptd->first;
  mem_fn_t mf = ptd->second;
  delete ptd;
  return (px->*mf)();
}
template<typename T>
HANDLE beginthread2(T& x, UINT (T::*memFn)(), int priority = THREAD_PRIORITY_NORMAL, UINT stack = 0, DWORD flags = 0, LPSECURITY_ATTRIBUTES lpsa = 0) {
  typedef std::pair<T*, UINT (T::*)()> thread_data_t;
  std::auto_ptr<thread_data_t> ptd(new thread_data_t(&x, memFn));
  uintptr_t ret = _beginthreadex(lpsa, stack, beginthread2_entry<T>, ptd.get(), flags, 0);
  if (ret != 0)
    ptd.release();
  return reinterpret_cast<HANDLE>(ret);
}
int main() {
  Hoge hoge;
  ATL::CHandle h(beginthread2(hoge, &Hoge::Proc));
  if (h != 0)
    WaitForSingleObject(h, INFINITE);
}

123:デフォルトの名無しさん
09/02/19 18:10:21
AfxBeginThread(boost::bind(&CView::ProcAfter, boost::ref(CView), this);
これでよくね?

124:デフォルトの名無しさん
09/02/19 18:50:29
LPSTRからLPCWSTRに変換するにはどうすればいいでしょうか

125:デフォルトの名無しさん
09/02/19 19:50:16
>>124
Visual StudioのStandard以上を持っているなら、ATLのCA2Wがお勧め。
無いなら、MultiByteToWideChar使え。

126:デフォルトの名無しさん
09/02/19 19:50:41
>>123
AfxBeginThreadって関数オブジェクト引数に取れるのか?

127:デフォルトの名無しさん
09/02/20 10:01:57
>>122
難しすぎて誰もわからないに一票

128:デフォルトの名無しさん
09/02/20 10:33:23
だいたい なんでメンバ関数に固執するんだろう?
インスタンスをスレッド間で共有する前提でアレコレ クラスカキコしてたら気が狂うんじゃね?

129:デフォルトの名無しさん
09/02/20 14:14:09
以下のソースで、読み込んだデータの改行コードが削除されてしまう。
istream_iteratorを使ってるせい?
環境はmingw(gcc 4.3.3)

ifstream fin("data.bin", ios::in | ios::binary);
if (fin.good()) {
  typedef vector<char> Data;
  istream_iterator<char> begin(fin), end;
  shared_ptr<Data> data(new Data(begin, end));
}

130:デフォルトの名無しさん
09/02/20 14:15:53
>>129 istreambuf_iterator

131:デフォルトの名無しさん
09/02/20 14:19:08
>>130
それだ!どうもありがとう。ペコリ。

132:デフォルトの名無しさん
09/02/21 09:23:53
!って人が使ってるの見てはじめて気づいた
すごいいらいらする


133:デフォルトの名無しさん
09/02/21 11:02:58
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!! !!!!!!!   !!!!!!!!!!!!!!!! !!!!!!!   !!!!!!!!
!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!! ! !!!!!!     !!!!!!!! ! !!!!!!     !!!!!!
!!! !!!! !!!!!!!!!!!!!!! !!!!!!! !!!! !!!!!!!!!!!!!!! !!!!!!!!
!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!
!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
しますか?

134:デフォルトの名無しさん
09/02/21 11:44:57
VS2005 C++でWindows Mobileの開発してます(CはDOS以来の初心者です)。
頻繁に呼ばれる文字列処理をする関数内の最初のオート変数として
void hoge(void){
TCHAR szReadBuf[2048];
の様な宣言をしているのですが、この処理を呼んでるループ処理辺りで
[Stack fault] Thread= といった様なエラーがでるので
void hoge(void){
static TCHAR szReadBuf[2048];
ZeroMemory(szReadBuf, sizeof(szReadBuf));
の様に解放されない処理にした所、最初のコード時より幾分か多く回せるようになりました。
そうゆうもんでしょうか?

135:デフォルトの名無しさん
09/02/21 11:54:54
>>134
スタック領域は特にモバイルなら大きく取られていないことが多いので、
2048要素の配列で溢れてしまったのでしょう。
後者なら、スタックは消費しないのでその点は大丈夫です。

それはいいとして、ZeroMemory()を呼ぶのが妥当かどうかは検討に値しますが。
# 何故自動変数の時には呼ばないのに静的にしたら呼ぶのか。

136:デフォルトの名無しさん
09/02/21 12:36:50
早速ありがとう御座います。
前者はその下でこのようにしてます。
szReadBuf[0]='\0';
後者でもこうすべきですね?
内部の処理が_tcstok等を使って文字列の置換をする処理なので、前回内容が
残ってると紛らわしいのでZeroMemoryしてました。

あと、GlobalAllocでアロケートした変数の再初期化時にZeroMemoryで初期化してますが
ZeroMemoryで無いほうがいいのでしょうか?

137:デフォルトの名無しさん
09/02/21 12:45:23
連投すいません
訂正)
× 前回内容が残ってると紛らわしいのでZeroMemoryしてました。
○ デバッグ時に前回内容が残ってると紛らわしいのでZeroMemoryしてました。


138:デフォルトの名無しさん
09/02/21 13:16:23
BC++です。
クラスを定義したヘッダファイルとそのメンバ関数を定義したcppファイルを
コンパイルするとUnresolved external '_main'となってしまいます。
一つにまとめて書くしかないのでしょうか?

139:デフォルトの名無しさん
09/02/21 14:01:03
「EXE 作る気はないぜオプション」をBCCに渡す。

140:デフォルトの名無しさん
09/02/21 14:57:58
-cを付けたらいきました。
ありがとうございます。

141:デフォルトの名無しさん
09/02/21 15:50:40
>>136
初期化したくて、可搬性を気にしないなら、ZeroMemory()で医院で内科医?

142:134
09/02/21 16:06:00
>>135 >>141
ありがとうございます。
とりあえず、今のレベルはエラー無く動かす事が目標なので、余裕がでたら考えたいと思います。

143:デフォルトの名無しさん
09/02/21 16:06:40
memsetだとなんでダメなの?

144:デフォルトの名無しさん
09/02/21 16:16:15
C++厨はmemset大嫌いだから

Cプログラマはmemsetが使える場面をいつも血眼で探してるから
C++作法に改宗する時に一番拒むのがここだよな

145:デフォルトの名無しさん
09/02/21 16:27:38
memsetいいじゃん
初期化楽だし
俺、C++使っててもメンバを構造体にしてmemsetでやっちゃってるし

146:デフォルトの名無しさん
09/02/21 16:35:24
C++厨は全部のメンバを代入文で初期化してんの?

147:デフォルトの名無しさん
09/02/21 16:36:31
あ、馬鹿が居る。

148:デフォルトの名無しさん
09/02/21 16:36:42
メンバ初期化子に決まってるだろ

149:デフォルトの名無しさん
09/02/21 16:49:31
C厨はポインタもmemsetで初期化してんのか?

150:デフォルトの名無しさん
09/02/21 16:51:45
>>122
大先生、なんか凄いことしてるみたいだから、一部修正してVC2005でコンパイルしてみたけど、
できないよYo。どうすれば良い?
#include <utility>
#include <memory>
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <functional>
#include <atlbase.h>

class Hoge {public: UINT Proc() {puts("Hoge::Proc"); return 0;}};
template<typename T>
UINT __stdcall beginthread2_entry(void* p) {
typedef std::pair<T*, UINT (T::*)()> thread_data_t;
thread_data_t* ptd = static_cast<thread_data_t*>(p);
T* px = ptd->first;
std::mem_fun_t<UINT, T> mf(ptd->second);
delete ptd;
return (px->*mf)(); // <======C2297: '->*' : 無効です。右オペランドには型 'std::mem_fun_t<_Result,_Ty>' が指定されています。
}
// To be continued

151:デフォルトの名無しさん
09/02/21 16:52:10
template<typename T>
HANDLE beginthread2(T& x, UINT (T::*memFn)(), int priority = THREAD_PRIORITY_NORMAL, UINT stack = 0, DWORD flags = 0, LPSECURITY_ATTRIBUTES lpsa = 0) {
typedef std::pair<T*, UINT (T::*)()> thread_data_t;
std::auto_ptr<thread_data_t> ptd(new thread_data_t(&x, memFn));
uintptr_t ret = _beginthreadex(lpsa, stack, beginthread2_entry<T>, ptd.get(), flags, 0);
if (ret != 0)
ptd.release();
return reinterpret_cast<HANDLE>(ret);
}
int main() {
Hoge hoge;
ATL::CHandle h(beginthread2(hoge, &Hoge::Proc));
if (h != 0)
WaitForSingleObject(h, INFINITE);
}


152:デフォルトの名無しさん
09/02/21 17:21:28
すまん。元の122のコードのmem_fn_tのmem_fn_t mf = ptd->second;の行は
UINT (T::*mf)() = ptd->second;が正しい。
改行制限でtypedefをやめたのに直すのを忘れていたみたいだ。

そしたらVC++2005でも通る。

153:デフォルトの名無しさん
09/02/21 17:46:34
>>152
超早いレス熱烈感謝あげ
typedef UINT (T::*mem_fn_t)();
が抜けていたんですか
mem_fn_tはstd::mem_fun_t関係のなんかと勝手に妄想してた

154:デフォルトの名無しさん
09/02/21 17:55:31
>>141は医者か

155:150,152
09/02/21 18:25:38
>>150
あいやーーー、俺、mem_fun_tは第一引数で渡すオブジェクトのポンタ
でオブジェクトを指定するっての忘れてたYo,orz
return mf(px); が正解だな



156:デフォルトの名無しさん
09/02/21 18:44:46
C++で可変長引数の関数を作るときは、Cと同じように
#include <stdarg.h>
とやって、
va_list, va_arg
を使えばいいでしょうか?


157:デフォルトの名無しさん
09/02/21 19:06:54
Cと同じでおk
ただし可変長引数の部分に非PODクラスを渡すことはできないから注意な

158:デフォルトの名無しさん
09/02/21 20:25:07
↓がg++4なら通るけどVC9など通らない。
これって自分何か勘違いしてますか?VC9のバグってことはありませんか?

struct MyClass {
int value;
void set_value(int v) { value = v; }
int get_value(void) const { return value; }
};
vector<std::tr1::shared_ptr<MyClass> > v;
...vに適当に要素を入れる...
for_each(v.begin(), v.end(),
std::tr1::bind(&MyClass::set_value, std::tr1::placeholders::_1,
std::tr1::bind(&MyClass::get_value, std::tr1::placeholders::_1)));
// bindでintがint&に変えられないというエラー

159:デフォルトの名無しさん
09/02/22 10:48:07
参照変数の初期化の右辺値で三項演算子使うのはマトモな所業の範疇?

160:デフォルトの名無しさん
09/02/22 12:13:57
右辺値じゃなくて右辺だな。
A ? B : C の B と C が両方左辺値なら問題ないし、
const 参照なら右辺値でも問題ない。

161:デフォルトの名無しさん
09/02/22 20:58:16
C++ コーディングスタンダードで、

int n;
if (cond) n = X;
else n = Y;

みたいにするなら、

int n = cond ? X : Y;

のほうがいいって書いてあったよな。


162:デフォルトの名無しさん
09/02/22 21:38:05
cond次第だろ

163:デフォルトの名無しさん
09/02/22 22:39:03
参照だとそもそも if-else が使えないから
? : を使わざるを得ないけどね。

164:デフォルトの名無しさん
09/02/23 00:53:15
int n = Y;
if (cond) n = X;

変数には初期値いれとこうぜ

165:デフォルトの名無しさん
09/02/23 01:06:47
俺のソースは>>161,164のすべてを気分で使い分けて、
ソースを読む人間を翻弄する

166:デフォルトの名無しさん
09/02/23 09:12:42
テンプレートクラスのコンストラクタ引数にその実態クラスのstaticメンバを使用する記述は問題ない?

template<T> class BB{
BB(const T &);
static const T func(T a){retunr a + 1;};
};

int x = 0;
BB<int> i(i.func(x)); // BB<int> i(BB<int>::func(x)); と同じ意味になる筈

167:デフォルトの名無しさん
09/02/23 20:33:23
質問ですが、例えば"net localgroup Administrators GroupX"というコマンドを
C++で実現するにはどうすればいいでしょうか?
一応自分なりに調べましたが、ShellExecute()やCreateProcess()を使うのは
個人的に美しくないかな、、、と思います。
知人に相談したら、vbsで
set objShell = WScript.CreateObject("WScript.Shell")
objShell.Exec "net localhost~"
ってやればいいんじゃない、とアドバイスを受けましたが、
vbsは全くわかららず、正直、自分でメンテナンスできるとは思えません。
C++のライブラリ関数で実現する方法があったら教授お願いします。

C言語では組み込み系を少しやっていました。
最近、C++でちょっとしたwindows用のプログラムを作ることになりました。
C++は初心者レベルだと思います。
開発環境はwindows XP + Visual studioです。
よろしくお願いします。

168:デフォルトの名無しさん
09/02/23 20:38:57
C++のライブラリにはないから、
APIをたたくしかないな。Win32スレに行ってみたら。


169:デフォルトの名無しさん
09/02/23 20:40:47
>>167
プロセスを起動するのはOSの役割なのでOSのAPIを使う
って頭になれば問題ない

170:デフォルトの名無しさん
09/02/23 20:43:22
>>167
騙されているぞ。
そのVBSのコードはShellExecuteを呼ぶのと同じだ。

171:デフォルトの名無しさん
09/02/23 21:11:43
>>167です。
>>168-170 回答ありがとうございました。
C++のライブラリにはないのですね。
なんとなく、(いないとは思いますが)netコマンドを削除する人がいたら嫌だな
という浅い考えで、ライブラリを使いたいと思っていました。

>>168さんの忠告どおりWin32スレに行こうと思いますが、
もうちょっと自分でWin32を調べてからにしたいと思います。
正直、何をどう質問すればいいのか、というのがわからない状態ですので、、、
(結局、>>169さんの忠告どおり、割り切りそうな気がしますが)
>>170さん そうなんですか。まあ、知人もこっちのほうが簡単だよ、
っていう感じだったので、悪意はなかったと思います

どうもありがとうございました。

172:デフォルトの名無しさん
09/02/23 22:04:01
コンソールアプリケーションで実用的なプログラムってありますか?
C++で学んだことを生かす練習のためにもなにか作りたいのですが・・

173:デフォルトの名無しさん
09/02/23 22:10:57
>>172
コンパイラ&リンカ

174:デフォルトの名無しさん
09/02/23 22:41:03
>>173
ありがとうございます
自分の力じゃ無理そうなのでアルゴリズムから作っていこうと思います

175:デフォルトの名無しさん
09/02/24 10:15:53
圧縮アルゴリズムおもろいよ

176:デフォルトの名無しさん
09/02/24 15:37:21
構造体A(メンバchar a , int b)をsizeofした値を求めろって問題は
5と8どちらを答えるべきなんですかね。
パディングも含めた値が実際の答えなのでしょうか?

177:デフォルトの名無しさん
09/02/24 15:43:08
intのサイズすら環境依存でFA

178:デフォルトの名無しさん
09/02/24 16:17:40
>>176
答えはsizeof( A )だろ


179:デフォルトの名無しさん
09/02/24 19:12:55
>>178
お前まぢ頭いいな

180:デフォルトの名無しさん
09/02/24 19:43:18
('A`)に見えた


181:デフォルトの名無しさん
09/02/24 19:44:54
sizeof に目がなくて

182:デフォルトの名無しさん
09/02/24 20:08:55
sizeof('A`)だと8なのでやはり8が答えみたいですね
ありがとうございました。

183:デフォルトの名無しさん
09/02/24 22:27:13
>>182
俺の環境では5になるんだが

184:デフォルトの名無しさん
09/02/24 23:19:58
>>182 環境依存
#include<stdio.h>

#define MACRO(type) printf("sizeof(%s)=%d\n", #type, sizeof(type))

#pragma pack(push, 1)
struct pack1{
char a;
int b;
};
#pragma pack(pop)

#pragma pack(push, 2)
struct pack2{
char a;
int b;
};
#pragma pack(pop)

#pragma pack(push, 4)
struct pack4{
char a;
int b;
};
#pragma pack(pop)

int main(void){
MACRO(struct pack1);
MACRO(struct pack2);
MACRO(struct pack4);
return 0;
}

185:デフォルトの名無しさん
09/02/25 01:13:18
なんと…
処理系依存なのでどれも正解ということですか!
コードまでご丁寧にありがとうございました。


186:デフォルトの名無しさん
09/02/25 09:51:49
処理系というか、自分で決められるといった方が正しい

187:デフォルトの名無しさん
09/02/25 11:38:22
#include <stdio.h>
#include <string.h>

struct address{
char name[20];
char jusyo[21];
int age;
};

int main(void)
{
struct address abc;

int s = 1;
if(s = 1){
char name[30];
char jusyo[70];
int age;

printf("名前? "); scanf("%s", &name);
printf("住所? "); scanf("%s", &jusyo);
printf("年齢? "); scanf("%d", &age);

abc.age = age;
strcpy(abc.name, jusyo);
}
return(0);
}
C言語を学習しています。
上プログラムでキーボードから日本語を入力し出力させたいのですが、どうすればいいのでしょうか?
Cygwinを使っています。


188:デフォルトの名無しさん
09/02/25 11:47:00
printf使えば良い

189:デフォルトの名無しさん
09/02/25 11:47:45
>>187
やったことないけど
URLリンク(pinoki.la.coocan.jp)


190:デフォルトの名無しさん
09/02/25 12:08:46
>>187
cygwin自体が日本語の入出力をできない状態なら>189へ。
gccのコンパイルオプションについて知りたいならcygwinスレへ。
まぁ、動くかどうかは兎も角scanf()の使い方も間違っているわけだが。
使わないに越したことはないが、scanf("%29s", name)とするのが無難。

191:デフォルトの名無しさん
09/02/25 12:11:18
構造体のメンバとローカル変数の配列サイズが違うじゃん。それは拙いっしょ。

192:デフォルトの名無しさん
09/02/25 15:13:30
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。
1>C:\Documents and Settings\\デスクトップ\Game\ActionGame\/GameAppli\ActionGame.exe : fatal error LNK1120: 外部参照 2 が未解決です。

#include <fstream>

をインクルードすると上記のエラーが出ます

どうすればいいのですか;;

193:デフォルトの名無しさん
09/02/25 15:24:46
プロジェクトのプロパティ→C/C++→コード生成→ランタイムライブラリ
を、どれか正しいものに変更する

なんか他の外部ライブラリ使ってるだろ?

194:デフォルトの名無しさん
09/02/25 15:26:17
デバッグ版とリリース版のオブジェクトが混在しているように見える
いったんすべてのオブジェクトを削除してビルドしなおせばいい

ほかから持ってきたライブラリ結合してるならリンクオプションをそれにあわせる

195:デフォルトの名無しさん
09/02/26 06:44:15
staticメンバ関数を利用するメリットってあるんでしょうか?

196:195
09/02/26 06:51:07
すいません
スレ移動します

197:195 ◆Ci3UmwhFqY
09/02/26 07:18:27
>>196 は他人です

198:デフォルトの名無しさん
09/02/26 10:37:07
何でメリットがないと思ったのか、それが知りたい。

199:デフォルトの名無しさん
09/02/26 12:19:36
つnew, singleton

200:デフォルトの名無しさん
09/02/26 12:23:18
コールバック関数のポインタを取るCスタイルのAPIへなんとかしてクラスを配送したいときに

201:デフォルトの名無しさん
09/02/27 02:01:54
質問です。

class Foo { void Bar(void* ptr); };
void Foo::Bar(void* const ptr) {}

VisualC++2008 にてこの様なクラスを作ったところ、コンパイルエラーも警告も出ずにコンパイルが通りました。
疑問に思ったのは Foo::Bar の引数を、void* から void* const に変えてもエラーが出ない事です。

これは文法的に正しいんでしょうか?それともVC++の独自拡張だったりするんでしょうか。

202:デフォルトの名無しさん
09/02/27 02:10:38
文法的にOK

203:デフォルトの名無しさん
09/02/27 02:21:40
>>201

class Foo { void Bar(int ptr); };
void Foo::Bar(int const ptr) {}

が問題ないのと同じこと。

204:デフォルトの名無しさん
09/02/27 02:51:20
>>202-203
仮引数にconstをつけるのは実装と宣言で違っても文法的に問題無いのですね。
勉強になりました、ありがとうございました。

205:デフォルトの名無しさん
09/02/28 05:09:10
とても基本的なことなのですが、
符号なし整数の変数で与えられた数 N - 1 から 0 まで順番に処理をするループは、どう書くのが一般的ですか。
for (size_t i = N - 1; i >= 0; --i) だとダメですよね。

自分が考えた書き方は、
const size_t N = ...;
for (size_t i = N; i > 0; --i) hoge(i - 1);
for (size_t i = 0; i < N; ++i) hoge(N - i - 1);
for (size_t i = N - 1; i != ~0; --i) hoge(i);
ですが、どれも使われるのでしょうか。

206:デフォルトの名無しさん
09/02/28 05:13:20
size_t i = N;
do { --i; hoge(i); } while (i > 0);


207:206
09/02/28 05:14:35
ああ、書いてから気づいたけど >>206 は N が初めから 0 だったらダメだね

208:デフォルトの名無しさん
09/02/28 05:36:00
T i = M; //M = N - 1ということで
do {
hoge(i);
} while (i-- != 0);
これだと、MがT型の最大値でも対応できるはず。

209:デフォルトの名無しさん
09/02/28 06:46:33
>>205
普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど
size_tを使う理由が分からない

210:デフォルトの名無しさん
09/02/28 08:29:35
>>209
メモリのサイズを意味するときはsize_tを使うようにしてる
64ビット環境だとunsigned long longになるのかな

211:デフォルトの名無しさん
09/02/28 11:52:40
>>209
> i >= 0;

↑は符合無しだと常に真だろ。

212:デフォルトの名無しさん
09/02/28 11:53:48
何か問題でも?

213:デフォルトの名無しさん
09/02/28 11:54:56
for (i = 0; i > N; ++i) {;} // ループ中に前後の値が影響しない場合。
if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。
while 系をカウントループに使うのは愚策と考える。

214:デフォルトの名無しさん
09/02/28 12:02:05
>>212
やめられない、とまらない

215:デフォルトの名無しさん
09/02/28 12:33:44
while(N-->0)は普通に使うだろ
--が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん

216:デフォルトの名無しさん
09/02/28 12:39:17
その考えはなかった

217:デフォルトの名無しさん
09/02/28 12:43:37
>>215
そんな餌にクマー
まあでも>>205の要求にあってるしシンプルでわかりやすいな

218:デフォルトの名無しさん
09/02/28 13:16:49
>>215
ああ、意外と面白い使い方かも・・・

視覚的にわかり易く書かない場合は
>0は書かなくても大丈夫か

219:デフォルトの名無しさん
09/02/28 14:09:16
有名だろ、それ

220:デフォルトの名無しさん
09/02/28 14:16:21
ぶっちゃけ初めて見た

221:デフォルトの名無しさん
09/02/28 14:20:36
ソース自体は見た事があるような気もするけど、考え方は初めて見た。

222:デフォルトの名無しさん
09/02/28 16:14:42
減少していくのに減少していく方向が空いてるのはなんとなく怖いなぁ

223:デフォルトの名無しさん
09/02/28 17:18:11
>>215
while(N-->0) って見た目が素敵だな


224:デフォルトの名無しさん
09/02/28 17:23:55
AAのプログラム言語とかなら、見た目で分かりやすいかもな・・・

225:デフォルトの名無しさん
09/02/28 17:39:46
befungeのことですね!!

226:デフォルトの名無しさん
09/02/28 17:41:03
面白そうだけど絶対コーディングしにくいな
ほぼ記号だろw

227:デフォルトの名無しさん
09/02/28 20:31:33
さすがショートコーディングスレ。
ためにな・・・って、あれ?


228:デフォルトの名無しさん
09/03/01 18:45:19
繰り返し処理のことを何ていいますか?
専門的にお願いします。

229:デフォルトの名無しさん
09/03/01 18:49:47
反復処理とか繰り返し処理とか

230:デフォルトの名無しさん
09/03/01 20:00:35
繰り返し処理のことを何ていいますか?
専門的にお願いします。

231:デフォルトの名無しさん
09/03/01 20:01:14
反復処理とか繰り返し処理とか

232:デフォルトの名無しさん
09/03/01 20:38:29
>>210
メモリのサイズを入れる型ってsize_t以外になんかなかった?

233:デフォルトの名無しさん
09/03/01 20:50:58
繰り返し処理のことを何ていいますか?
専門的にお願いします。

234:デフォルトの名無しさん
09/03/01 20:55:57
ループ処理じゃね?w
反復も繰り返しだろうけど、お前は違い分からないだろう

235:デフォルトの名無しさん
09/03/01 21:26:00
ぶっちゃけC/C++の話じゃないからスレ違い

236:デフォルトの名無しさん
09/03/01 21:29:11
>>234>>231>>229
もうちょっとかっこいい言い方あるだろ
それを教えろ

237:デフォルトの名無しさん
09/03/01 21:31:09
>>236
死ねハゲ

238:デフォルトの名無しさん
09/03/01 21:31:47
反復処理とか繰り返し処理とか

239:デフォルトの名無しさん
09/03/01 21:47:20
リピート

240:デフォルトの名無しさん
09/03/01 22:14:30
>>228-231
見事な繰り返し処理
>>232は空気嫁

241:デフォルトの名無しさん
09/03/01 22:19:39
>>232
ssize_tとか、でもCでもC++でも標準ではないけど。

242:デフォルトの名無しさん
09/03/01 22:24:27
>>232
ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが

243:デフォルトの名無しさん
09/03/01 22:34:14
>>241 >>242
そうだな。size_tでよかった。


244:デフォルトの名無しさん
09/03/03 05:50:11
まだ初心者なのですが、batファイルをC++builder6で
ボタンを押したら実行するようにしたいので

ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW);

と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL

245:デフォルトの名無しさん
09/03/03 06:13:52
>>244
何故、どう巧くいかないのか書かないのですか?

246:デフォルトの名無しさん
09/03/03 06:28:56
実行はされるのですが(コマンドプロントが一瞬表示される)
バッチファイルの中身自体が実行されません;;

247:デフォルトの名無しさん
09/03/03 06:39:59
batの最後に

pause

入れとけ


248:デフォルトの名無しさん
09/03/03 07:00:46
>>247
ありがとうございます。

やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?

249:デフォルトの名無しさん
09/03/03 07:08:14
ファイルパスをちゃんと指定すればいいじゃん・・・

250:デフォルトの名無しさん
09/03/03 07:12:19
できました!
こんな時間に、質問に答えてくださりありがとうございました
大変助かりました。

251:デフォルトの名無しさん
09/03/03 18:34:32
以下のような感じで「*」の前後にスペースが
入っている場合もポインタの宣言なんでしょうか?

static unsigned int * ADDR;

スペースが、後だけのもは参考書にも紹介されていますが
前後両方ともスペースのものは見つかりませんでした。

よろしくお願いいたします。

252:デフォルトの名無しさん
09/03/03 19:01:49
vector<string> * const (&u)[buf]; // こんな感じですか?

253:デフォルトの名無しさん
09/03/03 19:06:04
>>251
おんなじ。空白類がいくらあろうと関係ない。

254:デフォルトの名無しさん
09/03/03 19:47:28
>>252
static unsigned int * ADDR;

全くこのままのコードです。

>>253
ご回答有難う御座いました。
もやもやしていましたが、これですっきりしました。

255:デフォルトの名無しさん
09/03/04 03:11:45
VC++9の質問です。Unicode環境で
Void Func(LPCSTR pMsg);
みたいな関数があって、ここに文字列を渡すのですが、
Func("xxx");
というように普通に書くと問題ないのですが、
Func(_T("xxx"));
とやると、
const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。
全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?


256:デフォルトの名無しさん
09/03/04 03:14:42
>>255
_Tで括るのはLPC"T"STRのとき。
LPCSTRはconst char*のtypedefだから_Tは要らない。

257:デフォルトの名無しさん
09/03/04 03:25:58
>>256
なるほど、ありがとうございました。

258:デフォルトの名無しさん
09/03/04 13:36:24
初歩的過ぎてすいませんが...

すでに宣言してある配列の配列数を求めて
それと同じ配列数の配列を宣言するには
どうすればいいですか?

よろしくお願いします。

259:デフォルトの名無しさん
09/03/04 13:39:38
>>258
配列数はプログラム書いた人しか知らないから無理
それができたら配列のオーバーフロー管理も楽なんだけど


260:デフォルトの名無しさん
09/03/04 13:44:40
>>258
状況がよくわからん

261:259
09/03/04 13:44:42
sizeof(配列) / sizeof(型)
でいいか
マクロで定義して同じマクロ使うとか


262:デフォルトの名無しさん
09/03/04 13:49:06
char a[]={10, 10, 10};
char b[sizeof(a)];
int c[(sizeof(a)-1+sizeof(int))/sizeof(int)]

263:258
09/03/04 13:53:28
すいません言葉が足りなすぎました。。

int a[]= {1,2,...};

size=sizeof(a)/sizeof(a[0]);

int b[size];

として同じ配列数の新しい配列を宣言しようとしてもできません。

264:デフォルトの名無しさん
09/03/04 13:56:39
C++ なら const int size
Cなら int b[sizeof(a)]

265:デフォルトの名無しさん
09/03/04 13:57:14
>>263
size の型は何か

言語をいえ言語を
C か C++どっちだ
あとCならC89かC99なのか

266:デフォルトの名無しさん
09/03/04 13:57:33
>>263
コンパイラも

267:デフォルトの名無しさん
09/03/04 14:03:12
>>265
C++です。
size の型はintです
>>266
gccです。

268:258
09/03/04 14:08:43
const int size = sizeof(a)/sizeof(a[0]);

int b[size];

として宣言できました。

ありがとうございました。

269:デフォルトの名無しさん
09/03/04 15:03:27
配列の要素に変数が使える規格って無かったっけ


270:デフォルトの名無しさん
09/03/04 15:30:51
>>269
C99だろ

271:デフォルトの名無しさん
09/03/04 17:19:24
連立方程式のを渡したら戻ってくる関数ってありますか?

272:デフォルトの名無しさん
09/03/04 17:20:51
>>271
標準にはない
標準じゃなくていいならある

273:デフォルトの名無しさん
09/03/05 09:53:35
assert()と_ASSERT()ってなにか違いがあるのでしょうか?

274:デフォルトの名無しさん
09/03/05 10:11:11
assertはC/C++標準
結果としてabort()
_ASSERTはVC++独自
_CrtSetReportMode等で動作の調整が可能

275:デフォルトの名無しさん
09/03/05 18:14:15
メンバ関数のポインタの宣言はCxxx::*funcなのに
取得はCxxx::&funcでなく&Cxxx::funcなの?
&がなんで宣言の時の*の位置より移動するの?

276:デフォルトの名無しさん
09/03/05 18:40:47
>>275
発想としては、Cxxx::という修飾が
メンバへのポインタ型では*にかかっていて、
メンバへのポインタを得るときには、メンバ名funcにかかっている
ということのようだ。

277:デフォルトの名無しさん
09/03/05 18:51:32
俺としては逆なんだが
なんでCxxx::&funcなの?
どこのクラスのメンバ関数のアドレスか分からんが

278:デフォルトの名無しさん
09/03/05 20:41:28
大変だー
さっぱりわからん

279:デフォルトの名無しさん
09/03/05 20:43:44
>>278
何が分からないんだかさっぱり分からないぞ

280:デフォルトの名無しさん
09/03/05 20:44:43
>>275
単に文法的な曖昧さを除いた結果そうなっただけ。

class A {
public:
 static void (*A::func)();
};

としてしまうと、static メンバ変数の実体定義がこうなってしまう。

void (*A::A::func)();

どっちがどっちの A:: やら分からん。

281:デフォルトの名無しさん
09/03/05 21:16:46
もうクラスのメンバ関数のポインタは無しで

282:デフォルトの名無しさん
09/03/05 22:09:09
9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。

283:デフォルトの名無しさん
09/03/05 22:41:19
delegate パターンで使うね

284:デフォルトの名無しさん
09/03/06 01:31:13
じゃあdeleteパターンで

285:276
09/03/06 19:49:52
>>276, >>280
すみません、レス読んでも、それが
取得はCxxx::&funcでなく&Cxxx::funcなの?
の回答になるのか、さっぱり理解できないですが><

あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが
なんで良くないんですか?

286:デフォルトの名無しさん
09/03/06 20:12:15
なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか?
派生クラスは無いのですが
その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません

287:デフォルトの名無しさん
09/03/06 20:16:31
>>286
まずは、その抽象クラスへのポインタ型か参照型を引数にしている?

288:デフォルトの名無しさん
09/03/06 20:24:22
>>287
ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に
としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です

289:デフォルトの名無しさん
09/03/06 20:27:48
>>286
派生クラスがない、ではなく、派生クラスは自分で作れということでは?

290:デフォルトの名無しさん
09/03/06 20:29:59
ああ、そうかもしれない

291:デフォルトの名無しさん
09/03/06 20:43:25
"派生クラスの無い抽象クラスが型な引数をとる関数"
これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ

292:デフォルトの名無しさん
09/03/06 20:56:18
覚えておきます、ありがとうございました

293:デフォルトの名無しさん
09/03/06 22:13:20
>>285
普通の関数でも&(func)はよくないだろ?
そういうこと

294:デフォルトの名無しさん
09/03/06 22:51:58
>>293
普通の関数で、&funcを&(func)にするとコンパイルエラーにでもなるのか?

>>280 のvoid (*A::func)(); は何を宣言しているんだ?
本人はメンバー関数へのポインタ宣言のつもりなのかな
これだと、俺俺的にはfuncはスコープAにあり、引数void型で戻り型voidの関数を指すポインタの宣言してると解釈するんだが
つまり、funcは引数void型で戻り型voidの関数ならA::以外のでも受付OK
そうなると、funcはA::以外のでも受付OKなのにメンバー関数へのポインタ宣言ですって言えないよな
そうなるから、*Cxx::じゃなく、Cxx::*をメンバーへのポインタ宣言としているだろ
俺俺解釈間違ってる?

295:デフォルトの名無しさん
09/03/06 23:05:45
>>294
関数は式中に現れると関数ポインタに暗黙変換される
だから(func)はfunc関数へのポインタで、&(func)はそのポインタのアドレスになる
つまり関数ポインタへのポインタになる
そして(func)は右辺値だから、そんなものを使うとろくなことにならない

一方&funcは、関数が単項&演算子のオペランドの場合は関数ポインタに変換されないと特別に決まってるから
無事にfuncへのポインタが取れる


と、思ってたんだがよくよく読むと()の中身が関数の場合は特別に()を外しても関数になると決まっているらしい
だから&funcも&(func)も全く一緒だ
すまん

296:デフォルトの名無しさん
09/03/07 23:59:08
グローバル変数についての質問です。
C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」
と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、
プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので

//EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。
 memset(EDIT_DATA, 0, sizeof(EDIT_DATA));

という処理を加えたところ途端にメモリの使用量が跳ね上がりました。
最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので
いったい初期化処理を行っていない宣言した直後のグローバル変数と
memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。

297:デフォルトの名無しさん
09/03/08 00:16:13
おまいの使ってるOSが
書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には
アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。

298:デフォルトの名無しさん
09/03/08 01:38:45
>>297
私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが
以下のような考えでよいのでしょうか?

私の使っているOS(WinsowsXP)の場合
・関数内で宣言するローカル変数の場合
void main(){
  int a;        //この時点で非初期化データ領域に変数aの存在が知らされる。
  printf("%d\n", a);  //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない)
  a = 0;        //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
  printf("%d\n", a);  //0が表示される(物理メモリにはaが存在する)
}

・関数外で宣言するグローバル変数の場合
int b;          //この時点で非初期化データ領域に変数bの存在が知らされる。
void main(){
  printf("%d\n", b);  //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える)
  b = 0;        //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える)
  printf("%d\n", b);  //0が表示される(物理メモリにはbが存在する)
}

299:デフォルトの名無しさん
09/03/08 06:38:13
>298
とりあえず環境依存の話だというのは認識しておいてくれ。

まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。
ローカル変数は BSS には確保されない(スタックに確保される)。
非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に
「知らされる」という表現はおかしい。
物理メモリの割り当ては OS、ローダが行う。
恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。
なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか?

「仮想記憶」でぐぐるといいと思う。

300:デフォルトの名無しさん
09/03/08 08:00:03
void fn(int x){~;};
void fn_nul(int){};


if(a){ fn(a);}


static void (*const_f[2])(int) = {fn, fn_nul};
f[(a>>3)&0x1](a);

どっちが効率いいかな?

301:300 訂正
09/03/08 08:01:30
static void (*const _f[2])(int) = {fn, fn_nul};
_f[(a>>3)&0x1](a);

302:デフォルトの名無しさん
09/03/08 08:08:17
>>299
やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが
ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。
仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。
もう少し時間をかけてじっくりと理解を深めていこうかと思います。
ありがとうございました。

303:デフォルトの名無しさん
09/03/08 10:23:48
CPUアーキテクチャ側から勉強するといいかもね。
俺は「はじめて読む486」という本が参考になった。

304:デフォルトの名無しさん
09/03/08 10:46:03
>>301
下の方が効率いい。
ただし、何かコメントしておかないと
可読性が低い。

305:デフォルトの名無しさん
09/03/08 17:01:16
>>303
CPUじゃなくOS

306:デフォルトの名無しさん
09/03/08 19:10:52
困ってます。教えてください。
1つはサウンドバッファ書き込み用のCALLBACK関数で、
もう一つはMAINスレッドにあるリードルーチン。
MAINスレッドにあるリードルーチンをある条件時に寝かせ、
CALLBACK関数側から寝てる状態を起こしたい処理なのですが、
何か良い方法ありますでしょうか?
sigwait()を使ってできそうなんだが、通常処理なので
signalは使いたくないのです。よろしくお願いします。


307:デフォルトの名無しさん
09/03/08 19:12:40
>>306
環境依存なので利用環境を書いてね

308:デフォルトの名無しさん
09/03/08 19:31:42
306です。
環境:linux. gcc version 4.3.2 ,SDL(Callback)
マルチスレッドではないのですが、CallBack関数側から、
MAINスレッドの寝ている状態を起こせないものかと、、、
MAINスレッドでやっている処理は、標準入力から
データ読み込み、固定領域にバッファリングしています。
バッファが一杯だったら、標準入力からの読み込みは
しないで寝かせたいのです。(BusyWaitやポーリングはNG)
gdk_input_addとgtk_mainの組み合わせで
とりあえずできたのですが、gtkを使うのは目的外かと、
よろしくお願いします。





309:デフォルトの名無しさん
09/03/08 20:08:54
>>308
pthread.h を覗いてみては?
pthread_cond_??? あたりでいけそう

310:デフォルトの名無しさん
09/03/08 21:11:29
>>309
サンクスです。チューw
  pthread_cond_wait(&cond,&mutex);
  pthread_cond_signal(&cond);
上記で実装しました。動作OKでした。
mutexの使い方は良く判りませんがこれから理解しておきます。
CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。
(DIONは書き込み規制はいってるの?)



311:デフォルトの名無しさん
09/03/09 03:45:12
ATL/WTLを参考にwindowsの簡易クラスライブラリ作ってみてるのですが
(ただのパクリですが・・・もちろん勉強のためです)
CStatic : public CWindow {
public:
 CStatic(HWND hWnd) : CWindow(hWnd) {}
 CStatic& operator=(HWND hWnd) { m_hWnd = hWnd; return *this; }
 ...
};
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
などのCStaticコンストラクタの初期化がコンパイル通りません。
>error C2679: 二項演算子 '=' : 型 'class CWindow' の右オペランドを扱う演算子は定義されていません。(または変換できません)
考えてみれば派生クラスに基底クラス代入しようとしてるので当然の結果だと思うのですが
ATL/WTLではこれが上手くいっているのは何故なんでしょうか?
ATL/WTL見たことある方で分かられる方があればご教示ください。

312:デフォルトの名無しさん
09/03/09 04:09:36
CStatic& operator=(HWND hWnd)
それ以前にこれ間違ってね?

313:デフォルトの名無しさん
09/03/09 04:16:54
>>312
レスありがとうございます。
WTLのをそのまま流用したつもりでしたが;
どこが間違ってるのでしょうか?戻り値の参照ですか?

314:デフォルトの名無しさん
09/03/09 04:27:45
いや、それだけしかないなら
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す
これに当てはまるoperator=が無いじゃん

315:デフォルトの名無しさん
09/03/09 04:47:48
>>314
すみません、そもそもoperator=は今回関係ないみたいです。
コンストラクタの初期化で
CStatic text(GetDlgItem(IDC_STATIC));
CStatic text = GetDlgItem(IDC_STATIC);
上の2つは同じという認識だったのですが上だけコンパイル通ります;
CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。

316:デフォルトの名無しさん
09/03/09 10:11:14
IDC_STATICは実際にこう書いてるの?
IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。

317:デフォルトの名無しさん
09/03/09 19:02:57
>>316
遅くなりすみません。実際は違う値(オリジナルの値)です。すみません。
例えばATL/WTL解説で有名な↓ここ
URLリンク(home.att.ne.jp)
では CStatic view = GetDlgItem(IDC_STATIC_VIEW); としておられます。

318:デフォルトの名無しさん
09/03/09 20:03:55
>>315
コンストラクタにexplicit付いてんじゃねぇの

319:デフォルトの名無しさん
09/03/09 20:49:52
>>318
explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか;

試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか?
class A { // 基底クラス
public:
 DWORD_PTR a; // データメンバ
 operator DWORD_PTR() { return a; }
 A(DWORD_PTR x = 0) : a(x) {} // コンストラクタ
 A getData() { return A(a); } // 自クラスでキャスト
};
class B : public A { // 派生クラス
public:
 B(DWORD_PTR x = 0) : A(x) {} // コンストラクタ
 B& operator=(DWORD_PTR x) { a = x; return *this; }
};

A aaa;
B bbb = aaa.getData(); // NG
bbb = aaa.getData(); // OK
それともこの再現自体が間違ってるのでしょうか・・・?

320:デフォルトの名無しさん
09/03/09 20:53:33
>>319
class A に A(a)のコンストラクタは付けないの?

321:デフォルトの名無しさん
09/03/09 21:06:28
>>319
VC2008EEで通ったけど

322:デフォルトの名無しさん
09/03/09 21:42:54
class Aの中でコピイコンストラクタ俺タイプが隠してあるんじゃ?

323:デフォルトの名無しさん
09/03/09 21:59:40
[質問内容]
C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、
メンバ配列についてお行儀のよい書き方を教えてください。
メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、
文字列や値は同様にメンバ変数として持つのか? それとも、
cppの上の方に無名空間で切った変数を新たに宣言するのか?

そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで
cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか?
ちょっと、わからないので教えてください。






324:デフォルトの名無しさん
09/03/09 22:34:42
static constならクラス内で初期化しない?

325:323
09/03/09 22:42:56
簡単に言うと、以下のようなクラスを考えてください。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 10 };
static const int Array[END];
};
<hoge.cpp>
const int CHoge::Array[END] = {
0,1,2,3,4,5,6,7,8,9 //!< ←ここの値をどのように書くとお行儀がいいか?
};

>>324
レスありがとうございます。
その場合、マジックナンバなどはどこに宣言してありますか?


326:デフォルトの名無しさん
09/03/09 22:52:04
>>325
そのまま数値書いてコメント付けとけばいいんじゃねぇの。
その値をどういう意味があって、どう使うかわからんから
ケースバイケースとしか言いようが無いと思うけど。

327:323
09/03/09 23:05:52
>>326 レスありがとうございます。
ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。
ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると
その構造体配列自体で、共通する値が出てきます。
<hoge.h>
class CHoge {
public:
CHoge(){}
~CHoge(){}
private:
enum { END = 3 };
struct BTN_TAG {
int X;
int Y;
int W;
int H;
char *Str;
};
static const BTN_TAG m_BTN[END];
};
<hoge.cpp>
const CHoge::BTN_TAG CHoge::m_BTN[END] = {
{ 100, 200, 200, 50, "ボタン1" }, //!< ここら辺の100とかの値
{ 100, 300, 200, 50, "ボタン2" },
{ 100, 400, 200, 50, "ボタン3" },
};
こういう場合は、どのようにするのがお行儀がいいでしょうか?


328:デフォルトの名無しさん
09/03/09 23:14:02
文字リテラル : リージョン の比次第だけどリージョン固定のクラス作れば?

329:デフォルトの名無しさん
09/03/09 23:26:46
>>327
そのまま100でいいんじゃないかなぁ。
200と50がデフォルトのボタン幅・高さとかだったり
頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。

でもまぁ俺だったら、UIの情報はプログラム中に書かず
リソースや外部ファイルに書いて実行時に読み込むけど。

330:デフォルトの名無しさん
09/03/09 23:27:48
>>328 
返信ありがとうございます。
リージョン固定というのを不勉強で知らないのですが、
CHogeからのみ参照できる、statc constだらけのクラスと考えれば
いいでしょうか?


331:デフォルトの名無しさん
09/03/09 23:35:33
template<TwidthX, TwidthY>class Btn{
static struct{int x, y; char *c;}m_BTN[3];
}
追い出すメリットが勝つるメンバは追い出す。

332:デフォルトの名無しさん
09/03/09 23:46:04
>>329
返信ありがとうございます。
考え方として了解しました。



333:デフォルトの名無しさん
09/03/09 23:59:08
>>331
返信ありがとうございます。
Btnクラスを作って、CHogeで参照するということでいいでしょうか?
(CHogeがメンバクラス(Btn)をもつという解釈でいいでしょうか?)
templateにしている理由が理解できていないのですが、お時間があれば説明いただけないでしょうか?


334:デフォルトの名無しさん
09/03/10 04:18:48
class Game {
char **board;
public:
void init() {
board = reinterpret_cast<char**>(new char[9][9]);
}
};
こう書くとコンパイルは通るんですが、boardにはBadpointerの値が
入ってます。なにか間違ってますでしょうか?


335:デフォルトの名無しさん
09/03/10 04:36:16
何もかもが間違っているような・・・

なんでキャストしてるのん?
そして何ゆえそんな危険なキャストしてるのん?
あと、配列の配列は配列のポインタで受けることはできても
ポインタのポインタで受けることはできないよ?

っていうか、僕も初心者だから意味わからん^^

336:デフォルトの名無しさん
09/03/10 05:50:54
>>335
ありがとうございます。
char *p[10] = new (char*)[10];
とか出来なくて、あんなコードになってしまいました。
どうすればいいですか?
char **p;
char *p[10];
とかをnewで初期化するにはどうすればいいですか?



337:デフォルトの名無しさん
09/03/10 06:55:33
p = new char[10];

338:デフォルトの名無しさん
09/03/10 10:30:43
そもそもinit()を呼んでいるのだろうか。

339:デフォルトの名無しさん
09/03/10 13:26:15
char** p;
p = new char*[10];

340:デフォルトの名無しさん
09/03/10 15:44:07
void init(int sfx1,int sfx2){ // 素敵な cast をどうしても使いたい場合。
board = reinterpret_cast<char**>(new char[sfx1*(sizeof(char*)+sfx2)]);
for(int i = 0; i< sfx1; ++i)board[i] = new(reinterpret_cast<char*>(board)+sfx1*sizeof(char*)+(sfx2*i))char[sfx2];
}

341:デフォルトの名無しさん
09/03/10 16:09:07
>>340
何がなにやらわけわからんw

342:デフォルトの名無しさん
09/03/10 17:33:37
>>340 を理解した上で
char *p[10]; とは char* を 10個用意する事だよ と指摘されればポンと膝を打つ
って寸法だ。

343:デフォルトの名無しさん
09/03/10 18:27:00
newってtry-catchするのとnothrowするのどっちがいいの?

344:デフォルトの名無しさん
09/03/10 18:52:35
>>343
try-cathc も nothrowも付けずにほっとく

345:デフォルトの名無しさん
09/03/10 20:13:46
膝を打った後どっちに進むかは読み書きしたコード量に因るかな


346:デフォルトの名無しさん
09/03/11 01:31:35
ptr_arrayつかうか、吹っ切れてmallocに先祖返りするかってことかい?

347:デフォルトの名無しさん
09/03/11 01:48:32
パッディングの罠に嵌りに逝くか[]演算子のくっ付き方を考えるか

348:デフォルトの名無しさん
09/03/11 07:51:57
初心者が配列 new なんか使うんじゃねーよ。 std::vector にしとけ。

349:デフォルトの名無しさん
09/03/11 15:13:45
vector 使うのが正解
下手に深く判ってるコード書いて、おまけに手が遅かったりしたら上司に認められて
他人のクソコードをメンテする係に抜擢されちまうよ

350:デフォルトの名無しさん
09/03/11 15:37:46
C++ Coding Standradsでは
生の配列はクラス内部で小さなデータを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポインタも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。

Googleコーディング標準ではスマポよりもまずスコポの使用を考えたら?って提案してた。

351:デフォルトの名無しさん
09/03/11 16:08:52
スコティッシュポールド

352:デフォルトの名無しさん
09/03/11 16:10:08
最近の若い子の省略はよくわからんのぉ

353:デフォルトの名無しさん
09/03/11 16:13:29
シコスでは
生配はクラ内で小デを持ちまわるような場合は使ってもいいって書いてたな、確か。
同じく、生ポも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。

グルコではスマポよりもまずスコポの使用を考えたら?って提案してた。

354:デフォルトの名無しさん
09/03/11 16:22:02
スコポ の検索結果 約 495 件中 1 - 10 件目 (0.43 秒)
スマポ の検索結果 約 1,710 件中 1 - 10 件目 (0.09 秒)

355:デフォルトの名無しさん
09/03/11 17:25:01
>>350
scoped_ptrもスマートポインタの一種だよ。

356:デフォルトの名無しさん
09/03/11 18:42:06
局所的、たとえば小さな関数内とかじゃ、なまぽで良いだろ
出来れば、ぽんたを扱わないで良い言語を使い、でC++で無いといけないところだけ
達人がその部分をプログラムする。

357:デフォルトの名無しさん
09/03/11 18:47:38
スマポってのも曖昧な言葉だな
auto_ptrなんか心情的にはそう呼びたくないけど一応スマポだし
*とかが使えるからってイテレータまでスマポ呼ばわりする奴もいるし
逆にshared_ptr以外はスマポじゃないって奴もいるし

スマポって何?

358:デフォルトの名無しさん
09/03/11 18:50:02
アホコードを書くDQNを隔離しておくための足かせ

359:デフォルトの名無しさん
09/03/11 19:00:48
ポインタのような動きをするものは全てスマートポインタ
具体的に言うと*とか->が使える生ポインタ以外の物

360:デフォルトの名無しさん
09/03/11 19:02:12
そーなのかー

361:デフォルトの名無しさん
09/03/11 19:20:52
>>358
お舞! それは絶対に正しい。

ポインタすら使えない、つまりC++を扱ってはいけないような奴に、
C++を使わせるのに必要なものだよな

362:デフォルトの名無しさん
09/03/11 19:27:16
自己も相対的にDQNかも知れない場合に備え
自主的に足かせを装着する訳だが

363:デフォルトの名無しさん
09/03/11 20:32:27
>>362
ですよね~。

364:デフォルトの名無しさん
09/03/11 21:43:09
ほんとDQNですみません。

365:デフォルトの名無しさん
09/03/12 02:06:14
ここでC++の勉強法を質問するのはスレ違いでしょうか?
それらしいスレがなかったので、一度ここで聞いてみようかなと…
独学のため、先輩方の意見などをお聞きしたいと思っています。

366:デフォルトの名無しさん
09/03/12 02:54:55
おれも知りたいかも
Cやったら、ビジネス的な意味とオブジェクト指向を学びたいので、次はJavaに行くべきか、C++もやったほうがいいのか、迷う
C++は、モノにするには、やる範囲が広そうだし、Javaなのかな

ビジネス的な意味でC++,C#,Javaの位置付けってどういうもんなんですか?

367:デフォルトの名無しさん
09/03/12 06:58:49
スレ違い

368:デフォルトの名無しさん
09/03/12 12:20:28
まずビジネス的な意味というのがわからん訳だが

369:デフォルトの名無しさん
09/03/12 19:44:28
Windows上のC++の質問なんですが、プロパティの中のコード生成のランタイムライブラリーには
/MT
/MTd
/MD
/MDd
の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、
/MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。
どういう場合に/MTdにしなければだめになるのでしょうか?


370:デフォルトの名無しさん
09/03/12 20:13:31
>>369
ソリューションの構成をDebugからReleaseにする
ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ

371:デフォルトの名無しさん
09/03/12 20:22:34
ネットワーク共有ファイルに対してFindFirstFileを行うにはどうすればよいのでしょうか?
例えば
\\Server\folder\test.txt
にあるファイルに対して
FindFirstFile( "\\\\Server\\folder\\test.txt",&data );
とやっても失敗になってしまいます。
ショートパスからロングパスにしたいのですが、、、、

372:デフォルトの名無しさん
09/03/12 21:58:54
ドライブにマウントしてから x:\test.txt とかでアクセスすればいいのでは?

373:デフォルトの名無しさん
09/03/13 14:45:20
2chトリップ生成プログラム教えてください。
ライブラリ作った人とかいますか?

374:デフォルトの名無しさん
09/03/13 15:17:00
団子さんの出番ですね!!

375:デフォルトの名無しさん
09/03/13 15:21:22
やばい、>>374と同じ事が頭に浮かんだ

376:デフォルトの名無しさん
09/03/13 15:37:46
>>373
2chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ

377:デフォルトの名無しさん
09/03/13 15:40:55
[環境]C++ WindowsMobile向けアプリ(練習でデスクトップ版を作ります)
GoogleCalendarとの同期を取るアプリを作りたいんですが、
最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば
いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?





378:デフォルトの名無しさん
09/03/13 15:44:06
>>373
PHPのを探してきた
$trip = '';
if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $match)) {
$salt = substr($match[2]."H.", 1, 2);
$salt = preg_replace("/[^\.-z]/", ".", $salt);
$salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef");
$trip = substr(crypt($match[2], $salt),-10);
$_POST['FROM'] = $match[1].'</b>◆'.$trip.'<b>';
}
cryptがDESかMD5かで結果が変わる

379:デフォルトの名無しさん
09/03/13 15:55:43
>>373
Cのソースがあった
URLリンク(www.geocities.com)

380:デフォルトの名無しさん
09/03/14 20:40:26
using namespace std;
とソースの上に書くのと、
ソース全体を
namespace std {
...
}
というようにnamespaceの中に書くのとは、同じ意味ですか?


381:デフォルトの名無しさん
09/03/14 20:45:14
違います

382:デフォルトの名無しさん
09/03/14 21:00:19
ありがとうございます。
どう違うか、教えてください。


383:デフォルトの名無しさん
09/03/14 21:04:06
利用と宣言の違い棚。

384:デフォルトの名無しさん
09/03/14 21:11:37
わかりました。
後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは
できないということですね。
ありがとうございました。

385:デフォルトの名無しさん
09/03/14 21:22:45
std 名前空間内に自分で宣言を追加してはいけない。
規格上未定義動作になる。

386:デフォルトの名無しさん
09/03/15 00:23:57
std::swapの特殊化は置いてもいいけどね。

387:デフォルトの名無しさん
09/03/15 00:31:35
std::swapの特殊化じゃなくて、テンプレートの完全特化が許されてるってことね

388:デフォルトの名無しさん
09/03/16 01:03:47
stringのvectorにファイルを一行づつ読み込んで、まとめて別のファイルに書き込むというプログラムを作ってるんですけど
エラーチェックは↓見たいな感じで十分ですかね?

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

void read(char *file, vector<string> &lines);
void write(char *file, vector<string> &lines);

int main(void)
{

vector<string> lines;

read("C:/Work/from.txt", lines);
write("C:/Work/to.txt", lines);

cout << "正常終了" << endl;

return 0;
}

389:デフォルトの名無しさん
09/03/16 01:04:39
void read(char *file, vector<string> &lines)
{
ifstream ifs(file);

if(!ifs.is_open()){
cout << "コピー元ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}

while(ifs.good()){
string line;

getline(ifs, line);
lines.push_back(line);
}

if(!ifs.good() && !ifs.eof()){
cout << "読み込み途中でエラー" << endl;
ifs.close();
exit(EXIT_FAILURE);
}
}

390:デフォルトの名無しさん
09/03/16 01:05:31
void write(char *file, vector<string> &lines)
{
ofstream ofs(file);

if(!ofs.is_open()){
cout << "コピー先ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}

vector<string>::iterator i = lines.begin();

while(ofs.good())
{
ofs << *i;

if(++i == lines.end())
break;

ofs << endl;
}

if(!ofs.good() && !ofs.eof())
{
cout << "書き込み途中でエラー" << endl;
ofs.close();
exit(EXIT_FAILURE);
}
}

391:デフォルトの名無しさん
09/03/16 01:39:45
while (!feof()) {}
と同じ匂いを感じる。

ところで、
while (...) {
 string str;
 ...
}
より
string str;
while (...) {
 ...
}
の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね?
でも、スコープを限定した方が可読性等の面からは好ましいよね?
どっちが良いのかな。

392:デフォルトの名無しさん
09/03/16 01:44:22
その辺を言い出したらvectorから見直しだけどな。

393:デフォルトの名無しさん
09/03/16 02:11:37
>>391

{string str; while(...){...}}

394:デフォルトの名無しさん
09/03/16 02:26:56
for(string str; ifs.good();)

395:デフォルトの名無しさん
09/03/16 02:36:54
初期化がループに依存しないならコンパイラが良きに計らってくれると思うよ。

396:デフォルトの名無しさん
09/03/16 02:40:10
getline(,)後!ifs.good()でも1回push_backしちゃうのはマズくないか。

397:デフォルトの名無しさん
09/03/16 07:38:25
VC++9での質問です。

あるライブラリをインクルードする必要があるのですが、
ソース中に #pragma comment(lib, "ライブラリ名") と書くと、LNK2005のエラーが出ます。でも、
プロジェクト→プロパティ→リンカ→追加のライブラリ
のところに「ライブラリ名」を書くとLNK2005は出なくなりコンパイルできます。
リンクの順序が関係してるのかと思ったのですが、よくわかりません。
どういう基準で方法を選べばいいですか?


398:デフォルトの名無しさん
09/03/16 07:41:35
>>397
ライブラリのパスを通せばいいと思う

399:デフォルトの名無しさん
09/03/16 07:50:49
>>398
ありがとうございます。
ライブラリは見えてます。LNK2005は、同じライブラリを複数回リンクしようとした、
というエラーみたいなのです。自分の場合、
unsigned int *a = new unsigned int(100);
みたいな行がエラーになります。でもLNK2005が出ないやり方でリンクすると
この行も問題なくコンパイルされます。

書いてて思ったのですが、追加のライブラリのところにライブラリ名を書くと、
Visual Studioがリンクの順序を勝手に調整してくれるんですかね?


400:デフォルトの名無しさん
09/03/16 13:38:45
あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ
それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める)
下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに
セットするときに、現状のままだと余った桁に0が入ってしまいます。

データセット部
sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID);

余った桁に半角スペースが入るようなsprintf指定方法はありませんか?


401:デフォルトの名無しさん
09/03/16 14:41:57
>>399
もしかして複数ファイルに分けてる?
スタティックライブラリの関数名がダブってるような気がする

402:デフォルトの名無しさん
09/03/16 14:44:55
>>400
いってる意味がよく分からないけど
%11ld または %-11ld でいいのかな?

403:デフォルトの名無しさん
09/03/16 16:44:14
400です。
おかげさまで解決です。

404:デフォルトの名無しさん
09/03/16 16:54:03
おかげさまってマルチでよそで答えもらっただけだろ。

405:デフォルトの名無しさん
09/03/16 20:22:15
std::cinで矢印キーの入力を取得することはできますか?


406:デフォルトの名無しさん
09/03/16 20:29:07
質問です
WM_NCHITTESTをフックしたいのですが
SetWindowsHookEXの中のどの項目ならフックできるでしょうか?

407:デフォルトの名無しさん
09/03/16 22:16:04
>406
>The WM_NCHITTEST message is sent to a window when the cursor moves
より、このメッセージは Send される。
従って WH_CALLWNDPROC か WH_CALLWNDPROCRET だが、いずれもメッセージを調べるだけで変更することはできない。
別途処理したいならサブクラス化とかが必要。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch