【初心者歓迎】C/C++室 Ver.64【環境依存OK】
at TECH
1:デフォルトの名無しさん
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>
をインクルードすると上記のエラーが出ます
どうすればいいのですか;;
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4990日前に更新/69 KB
担当:undef