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
覚えておきます、ありがとうございました