1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.63【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1231499251/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
31 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 20:01:43 ] >>29 大丈夫ではあるけど、 関数内で二度と a の元の値を使えなくなってしまうので注意。 後になって処理を追加した際に、 途中で値が変更されてるのを忘れて処理を追加して 上手く動かねーとかなるといけないから、 なるべくなら別変数を作った方が好ましいし、 それでも a を変更したいんだ!ってんなら、コメントでも残しておくといい。
32 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 20:28:26 ] >>30-31 ありがとうございます
33 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:19:28 ] int func(int& a, int* b = &a) { if(a>10) a=10; return *b++; }
34 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:44:16 ] int func(const int a){ return (a>10)? 10+1: a+1; } wwww
35 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 23:05:14 ] 急に過疎ってどうしたんだ?
36 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 23:29:01 ] 春だからさ・・・・・
37 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 02:10:04 ] Cとgrassのハイブリッド言語かと思った。
38 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/02/14(土) 03:23:09 ] windowsアプリケーションなんですが Borland C Compiler 5.5にて MAKELONGマクロが警告にひっかかってしまいます。 windef.hの定義を見るに括弧が足りないのが原因のようです。 これは単純にwindef.hのミスですか?BCCのミスですか?私の設定ミスですか?
40 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 07:55:25 ] 調べなおしてみたらVC+2008EEに付属のSDKは括弧が多かったが昔のPlatformSDKのは少なかったわ
42 名前:39 mailto:sage [2009/02/14(土) 11:12:03 ] >>40-41 ありがとうございます。 MAKELONGを(あとMAKEWORDも) #undefして括弧増やした#defineしなおしてもいいもんでしょうかね?
43 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 11:43:07 ] >>42 しなおしてもいいし大元のファイルを修正してもいいし警告無視してもいいよ 簡単にすると( A | B << 16 )ってなるから ( B )に括弧が必要というわけか
44 名前:43 mailto:sage [2009/02/14(土) 11:45:56 ] ( B << 16 )に括弧が必要 の間違いでした
45 名前:39 mailto:sage [2009/02/14(土) 12:34:59 ] >>43-44 どうもでした。
46 名前:デフォルトの名無しさん [2009/02/15(日) 08:59:26 ] LPTSTRを使って char hoge[40]; みたいな固定長の、文字を入れておける場所を定義するのって出来ますか?
47 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 09:13:07 ] TCHAR s[40]; がいいかな
48 名前:デフォルトの名無しさん [2009/02/15(日) 09:18:16 ] ありがとうです。 それでできました!
49 名前:デフォルトの名無しさん [2009/02/15(日) 09:24:24 ] もう一個だけ質問させてください。 _T("ddd"); TEXT("ddd"); これって書き方が違うだけで同じですか?
50 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 09:39:22 ] 同じ。 強いて言うなら、前者はCライブラリの拡張で、後者はWin32。 ちなみに前者のバリエーションで_TEXTもある。
51 名前:デフォルトの名無しさん [2009/02/15(日) 23:26:08 ] ありがとうございます。なるほど。 TCHARとかLPTSTRとかにあわせて、TEXT("")を使います。
52 名前:デフォルトの名無しさん [2009/02/15(日) 23:33:30 ] 背景とカーソルを同時に表示しようと思うんですが、 その画像をまとめてメモリデバイスコンテキストに選択して、 「最終的に表示する画面」を先に作る方法が分からないので、 どなたか教えていただけないでしょうか。 環境は WinAPIです。 よろしくおねがいします
53 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:09:31 ] それはカーソルじゃなくてキャレットのことかね?
54 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:45:17 ] 関数の引数に関数を渡すことはできませんか? 処理の途中で指定した関数を入れたいんです。
55 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:46:34 ] >>54 関数ポインタというのがあってだな
56 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 00:51:08 ] thx出てきました!
57 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 01:02:45 ] // class A void Func(){} X.pfFunc = Func; // class X void (*pfFunc)(); void Shori(void pfFunc()){ (*pfFunc)(); これどうやって引数に渡す時と、使うとき書けばいいですか?
58 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 01:09:27 ] >>53 すいません言い方が悪かったです 画像2枚だと考えてください 背景の画像と 矢印の画像です。 よろしくおねがいします
59 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 01:51:58 ] >>58 WinAPIスレにでもどうぞ。 >>57 メンバ関数は普通の関数ポインタとは振る舞いが異なるので注意。 「メンバ関数のポインタ」とでもして、検索してみることをお勧め。
60 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 03:19:29 ] コンストラクタってパブリックにしないとだめですよね? newするときアクセスできないとか言われるんですが、内部でよんでくれるんじゃなかったんですか?
61 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 03:53:17 ] ポインタは使い終わったらNULLしたほうがいいんですか? NULLしないでポインタを持っていたクラスをdeleteしたらポインタがゴミとして残るんでしょうか? というかそうしたら変数も解放しなきゃいけないのですか?どうやんお?
62 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:04:37 ] >>61 NULLするってなんだよ?
63 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:08:33 ] >>61 どうやんお? でちょっと笑た ポインタとメモリの動的確保についてもーちょい学ぶべき NULLするってのはNULL入れるってことかい
64 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:12:26 ] ポインタはオマエ自身から持つ手綱 データはペットの犬 手綱は他人のペットにも付けられるが そのペットは苦しい。 自分の飼っている犬の手綱はポイチョと捨てると他人に迷惑だが 他人のペットに付けた手綱はポイチョと捨ててもあまり問題にはならない。 他人のペットも譲られて唯一の飼い主がオマエになればオマエに責任が
65 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:22:53 ] 難読Cコンテストを思い出した
66 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:28:14 ] メンバ関数ポインタは入れる時と使うときクラス名が必要なことがわかりました! これじゃあライブラリとして使えなく無いですか? 設計を見直せですか?
67 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:29:23 ] 定数へのポインタは渋谷のハチ公に首輪をつけるようなもの 全くの無意味ではないが楽しく一緒に遊んでくれない。 土佐犬にチワワ用の首輪を付けても首じゃなく足首に掛かったりして土佐犬を転ばせたりする。 だからと言ってロデオロープ的な void * で括ってアチコチ引き回したら犬が昇天する場合もある
68 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 04:37:03 ] やばい 全く集中できなくなった
69 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 05:07:23 ] 関数の中で static int a = 0; とした場合このaは関数を抜けても保持されるんでしょうか? 起動時最初の一回しか変数が存在しないことになるんでしょうか?
70 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 05:38:57 ] >>69 スコープがブロック内に限定されてるだけで、他はグローバル変数と同じと言える だからアドレスを渡して関数外からアクセスしようが問題ない
71 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 06:06:42 ] ありがとうございます!!! >>60 >>61 >>66 もお願いします!
72 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 07:12:22 ] 構造体の各値がintだとすると { { 1, 2, }, {3, 4,}, } 4個*4バイト=16バイト が返るようにするにはどうすればいいですか? []付けたんですけど funcの中で structA b[]; b = bufa; としたらstructA[]からstructA[]に変換できませんとでるんですがこれはどうなおせばいいでしょうか
75 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 07:24:43 ] structA b[100]; bに代入はできない b[0] = とかはできるけど
76 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 07:31:00 ] boost::bind.hpp boost::function.hpp を使うとか
78 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 10:57:01 ] >>75 C++でも出来ないとこってあるんですね サイズは送り元で計算して引数は増えますが一緒におくることにしました。 受取側の関数で構造体の配列変数を除くと1つ目の構造体しか表示確認できなかったんですが、 サイズを添え字にして強引?に全配列をプログラム実行の中で処理できました。 が、これ保障されてますか?安心してこういう使い方して大丈夫なんでしょうか?
79 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 12:38:17 ] いややっぱりなにも進展してませんでした function<void ()> f_buf が function<int ()> f_buf だったり function<bool ()> f_buf だったりした場合、汎用ライブラリにしたとして、使うたびに修正しないとだめじゃないですか? メンバ関数ポインタと結局同じなことに気づきました・・・
81 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 12:39:55 ] operator()() これはどういう意味なんでしょうか
82 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 12:49:04 ] >>81 関数オブジェクトでぐぐったら使い方含めてわかるかもよ
83 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:16:23 ] >>60 こういう風にnewとprivateなコンストラクタを組み合わせる技法は存在する。 class Hoge { public: static Hoge* Craete(int x) {return new Hoge(x);} private: Hoge(int); }
84 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:19:07 ] 出来そうな気がしてきました。 実行したい処理を()演算子の中に作ったクラスを型にした変数を引数として渡せば、 クラスの変数(); とすれば処理が実行されるということですね ありがとうございました。
85 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:20:31 ] >>80 実は、function<int ()>型やfunction<bool ()>型からfunction<void ()>型へ変換できる。 戻り値を見ないなら全部function<void ()>型にすればいい。
86 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 16:24:20 ] sprintfの逆のことをしたいのですがそういう関数なかったでしょうか? char str[]="年齢は10,性別は男"; 例えば、(str,"年齢は%d,性別は%s",age,sex)の引数が与えられると age=10,sex=男が得られるようにする関数です。 よろしくお願いします。
87 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 16:26:24 ] sscanf のこと?
88 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 16:40:27 ] >>87 それです。^^; あったような気がしていたのですがprintが 入っている名前の関数だと思い込んで探していました。 助かりました。ありがとうございました。
89 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 11:39:57 ] コールバック関数が今だに理解できないです。教えてください。
90 名前:43 mailto:sage [2009/02/18(水) 11:43:30 ] >>89 関数ポインタはわかるか
91 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:00:21 ] わかります。 void Func(){} void * f = Func; (*f)();
92 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:03:45 ] オブジェクトを作成するアプリケーションのインスタンスハンドルが必要だとヘルプに書いてあるんですが この場合thisを入れればいいんですか?
93 名前:43 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:26:57 ] >>92 状況によるだろう。 でもハンドルと書いてあるからthisはないと思うよ。 なんとなく、hInstanceいれるとこみたいだが。
95 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:38:56 ] >>93 ありがとうです! その場合CALLBACKがつくのはどれなんでしょうか メンバ関数もコールバックとして渡せるんですか?
96 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:41:45 ] Win32アプリの LRESULT CALLBACK WndProc はまた別物ですか?
97 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:22:14 ] WaitForSingleObjectは普通マルチスレッドで使うんですよね? 勝手に別スレッドで待機して制御は返す仕組みじゃないですよね?
98 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:25:43 ] まあそうだが、シングルスレッドでもオブジェクトがシグナル状態か確認する時も使う。
99 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:43:22 ] >>96 CALLBACKがどう#defineされてるか見てみるといい
100 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 14:49:12 ] gdb 用のGUI ツールお勧め教えて class 関連 CUI じゃツライす
101 名前:43 mailto:sage [2009/02/18(水) 16:26:59 ] >>95 コールバックをする関数の引数に定義された型と同じ関数(戻り値の型と引数の数、型が同じ関数)を作ってその関数名を渡せばいいんだよ メンバ関数は呼び出し規約(CALLBACK = stdcall)が違う(thiscall)かもしれない
102 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 17:09:50 ] >>96 そのコールバックは、引数の処理をどうするか、という指標なんであまり気にしなくて良いと思う
103 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 20:51:27 ] struct V4 { union { struct { float x, y, z, w; }; float m[4]; }; }; と書いた時、 xのアドレス == &m[0] 、yのアドレス == &m[1]、 … になったのですが、これはどんなコンパイラでやっても同じ様になるんでしょうか?
104 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:43:59 ] xのアドレス == &m[0]だけは保証されてる あとはコンパイラ次第
105 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:45:58 ] >>96 LRESULTは戻り値の型、>>91 でのvoid、 WndProcは関数名、>>91 でのFuncにあたる。 CALLBACKは他の人の言うとおり。
106 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:46:44 ] キーボード押しっぱなし時のWM_KEYDOWNは、一回発行された後に 少し時間を置いてから連続で発行されるんですか? キーボードからの入力でキャラクタを動かしているのですが、 キーボードおしっぱ→キャラクタが1ループ分動く→コンマ数秒無反応 →キャラクタが連続で動く、となってしまいます。 ゲームのキャラクタみたいにキーボードを押すとすぐに連続で動作してくれる 処理をしたいのですが・・
107 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 21:53:06 ] >>106 GetAsyncKeyState
108 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 22:08:17 ] >>107 こんな便利なものが・・・ ありがとうございます。
109 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 04:45:06 ] マルチスレッドの関数はグローバル領域に作ったほうがいいですか? クラスの中に入れるとめたくそ難しいんですが
110 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 05:12:32 ] 難しいと思うのならクラス内に作らなくても構いません。
111 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 05:24:48 ] なんでメンバ関数だとコンパイルできないんですか? 静的関数ならいんでしょうか
112 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 05:34:41 ] そりゃぁ、スレッド生成するAPIがクラスに対応してなければインスタンスへのポインタ(this)を渡せませんから。 thisを伴わない静的メンバ関数ならAPIから呼べますから、コンパイルもできるはずです。 まぁ、環境も書かなきゃエラーメッセージも書かないということは、詳しい説明は要らないのでしょうし、この辺で。
113 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 06:19:42 ] >>113 にほんごよめますか? >112 >まぁ、環境も書かなきゃエラーメッセージも書かないということは
115 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 13:37:43 ] Win32アプリのメッセージループ内で独自の処理をする時クラスのインスタンスとかを作るのはどこがいいんですか? ループに入る直前でいいんですか?いろいろなところにここにコードを追加してくださいとか書いてあるので不明です
116 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 13:42:45 ] #define _T("test.txt") fileName マクロの仮パラメータリスト内に予期せぬ文字列がありますのエラーが出ます。 どう書けばいいんですか?
117 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 13:56:14 ] あきらかに変だがどう使いたいわけ?
118 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 14:19:28 ] 文字を置き換えたいだけです。 プログラム中のどこだかわからなくなるので 先頭に置いてファイル名を変えられるようにしたいんです
119 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 14:38:07 ] だったら逆だろ? #define filename _T("test.txt")
120 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 14:56:56 ] 逆でしたか!どうもです
121 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 17:46:10 ] >>113 (非静的な)メンバ関数は普通の関数と違い、&演算子を使わないとメンバ関数へのポインタを得られない という点はエラーメッセージの言うとおり。 そうやってメンバ関数へのポインタを得たところで、>>113 のようにできないわけは、 メンバ関数へのポインタは、普通の関数へのポインタとは中身が異なっているため。 その主な理由は、仮想関数にもきちんと対応しないといけないことから。 メンバ関数を直接渡せるようにしたければ、自分でそういう関数を作ればいいじゃない。
122 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 18:10:21 ] AfxBeginThread(boost::bind(&CView::ProcAfter, boost::ref(CView), this); これでよくね?
124 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 18:50:29 ] LPSTRからLPCWSTRに変換するにはどうすればいいでしょうか
125 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 19:50:16 ] >>124 Visual StudioのStandard以上を持っているなら、ATLのCA2Wがお勧め。 無いなら、MultiByteToWideChar使え。
126 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 19:50:41 ] >>123 AfxBeginThreadって関数オブジェクト引数に取れるのか?
127 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 10:01:57 ] >>122 難しすぎて誰もわからないに一票
128 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 10:33:23 ] だいたい なんでメンバ関数に固執するんだろう? インスタンスをスレッド間で共有する前提でアレコレ クラスカキコしてたら気が狂うんじゃね?
129 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:15:53 ] >>129 istreambuf_iterator
131 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 14:19:08 ] >>130 それだ!どうもありがとう。ペコリ。
132 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 09:23:53 ] !って人が使ってるの見てはじめて気づいた すごいいらいらする
133 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 11:02:58 ] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!! !!!!!!! !!!!!!!!!!!!!!!! !!!!!!! !!!!!!!! !!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! ! !!!!!! !!!!!!!! ! !!!!!! !!!!!! !!! !!!! !!!!!!!!!!!!!!! !!!!!!! !!!! !!!!!!!!!!!!!!! !!!!!!!! !!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!!!!!!! !!!!!!!!!! !!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! しますか?
134 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 11:54:54 ] >>134 スタック領域は特にモバイルなら大きく取られていないことが多いので、 2048要素の配列で溢れてしまったのでしょう。 後者なら、スタックは消費しないのでその点は大丈夫です。 それはいいとして、ZeroMemory()を呼ぶのが妥当かどうかは検討に値しますが。 # 何故自動変数の時には呼ばないのに静的にしたら呼ぶのか。
136 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 12:36:50 ] 早速ありがとう御座います。 前者はその下でこのようにしてます。 szReadBuf[0]='\0'; 後者でもこうすべきですね? 内部の処理が_tcstok等を使って文字列の置換をする処理なので、前回内容が 残ってると紛らわしいのでZeroMemoryしてました。 あと、GlobalAllocでアロケートした変数の再初期化時にZeroMemoryで初期化してますが ZeroMemoryで無いほうがいいのでしょうか?
137 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 12:45:23 ] 連投すいません 訂正) × 前回内容が残ってると紛らわしいのでZeroMemoryしてました。 ○ デバッグ時に前回内容が残ってると紛らわしいのでZeroMemoryしてました。
138 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 13:16:23 ] BC++です。 クラスを定義したヘッダファイルとそのメンバ関数を定義したcppファイルを コンパイルするとUnresolved external '_main'となってしまいます。 一つにまとめて書くしかないのでしょうか?
139 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 14:01:03 ] 「EXE 作る気はないぜオプション」をBCCに渡す。
140 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 14:57:58 ] -cを付けたらいきました。 ありがとうございます。
141 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 15:50:40 ] >>136 初期化したくて、可搬性を気にしないなら、ZeroMemory()で医院で内科医?
142 名前:134 mailto:sage [2009/02/21(土) 16:06:00 ] >>135 >>141 ありがとうございます。 とりあえず、今のレベルはエラー無く動かす事が目標なので、余裕がでたら考えたいと思います。
143 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:06:40 ] memsetだとなんでダメなの?
144 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:16:15 ] C++厨はmemset大嫌いだから Cプログラマはmemsetが使える場面をいつも血眼で探してるから C++作法に改宗する時に一番拒むのがここだよな
145 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:27:38 ] memsetいいじゃん 初期化楽だし 俺、C++使っててもメンバを構造体にしてmemsetでやっちゃってるし
146 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:35:24 ] C++厨は全部のメンバを代入文で初期化してんの?
147 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:36:31 ] あ、馬鹿が居る。
148 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:36:42 ] メンバ初期化子に決まってるだろ
149 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 16:49:31 ] C厨はポインタもmemsetで初期化してんのか?
150 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 17:21:28 ] すまん。元の122のコードのmem_fn_tのmem_fn_t mf = ptd->second;の行は UINT (T::*mf)() = ptd->second;が正しい。 改行制限でtypedefをやめたのに直すのを忘れていたみたいだ。 そしたらVC++2005でも通る。
153 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 17:46:34 ] >>152 超早いレス熱烈感謝あげ typedef UINT (T::*mem_fn_t)(); が抜けていたんですか mem_fn_tはstd::mem_fun_t関係のなんかと勝手に妄想してた
154 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 17:55:31 ] >>141 は医者か
155 名前:150,152 mailto:sage [2009/02/21(土) 18:25:38 ] >>150 あいやーーー、俺、mem_fun_tは第一引数で渡すオブジェクトのポンタ でオブジェクトを指定するっての忘れてたYo,orz return mf(px); が正解だな
156 名前:デフォルトの名無しさん [2009/02/21(土) 18:44:46 ] C++で可変長引数の関数を作るときは、Cと同じように #include <stdarg.h> とやって、 va_list, va_arg を使えばいいでしょうか?
157 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 19:06:54 ] Cと同じでおk ただし可変長引数の部分に非PODクラスを渡すことはできないから注意な
158 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 10:48:07 ] 参照変数の初期化の右辺値で三項演算子使うのはマトモな所業の範疇?
160 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 12:13:57 ] 右辺値じゃなくて右辺だな。 A ? B : C の B と C が両方左辺値なら問題ないし、 const 参照なら右辺値でも問題ない。
161 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 20:58:16 ] C++ コーディングスタンダードで、 int n; if (cond) n = X; else n = Y; みたいにするなら、 int n = cond ? X : Y; のほうがいいって書いてあったよな。
162 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 21:38:05 ] cond次第だろ
163 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 22:39:03 ] 参照だとそもそも if-else が使えないから ? : を使わざるを得ないけどね。
164 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 00:53:15 ] int n = Y; if (cond) n = X; 変数には初期値いれとこうぜ
165 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 01:06:47 ] 俺のソースは>>161 ,164のすべてを気分で使い分けて、 ソースを読む人間を翻弄する
166 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 20:38:57 ] C++のライブラリにはないから、 APIをたたくしかないな。Win32スレに行ってみたら。
169 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 20:40:47 ] >>167 プロセスを起動するのはOSの役割なのでOSのAPIを使う って頭になれば問題ない
170 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 20:43:22 ] >>167 騙されているぞ。 そのVBSのコードはShellExecuteを呼ぶのと同じだ。
171 名前:デフォルトの名無しさん [2009/02/23(月) 21:11:43 ] >>167 です。 >>168-170 回答ありがとうございました。 C++のライブラリにはないのですね。 なんとなく、(いないとは思いますが)netコマンドを削除する人がいたら嫌だな という浅い考えで、ライブラリを使いたいと思っていました。 >>168 さんの忠告どおりWin32スレに行こうと思いますが、 もうちょっと自分でWin32を調べてからにしたいと思います。 正直、何をどう質問すればいいのか、というのがわからない状態ですので、、、 (結局、>>169 さんの忠告どおり、割り切りそうな気がしますが) >>170 さん そうなんですか。まあ、知人もこっちのほうが簡単だよ、 っていう感じだったので、悪意はなかったと思います どうもありがとうございました。
172 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 22:04:01 ] コンソールアプリケーションで実用的なプログラムってありますか? C++で学んだことを生かす練習のためにもなにか作りたいのですが・・
173 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 22:10:57 ] >>172 コンパイラ&リンカ
174 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 22:41:03 ] >>173 ありがとうございます 自分の力じゃ無理そうなのでアルゴリズムから作っていこうと思います
175 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 10:15:53 ] 圧縮アルゴリズムおもろいよ
176 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 15:37:21 ] 構造体A(メンバchar a , int b)をsizeofした値を求めろって問題は 5と8どちらを答えるべきなんですかね。 パディングも含めた値が実際の答えなのでしょうか?
177 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 15:43:08 ] intのサイズすら環境依存でFA
178 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 16:17:40 ] >>176 答えはsizeof( A )だろ
179 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 19:12:55 ] >>178 お前まぢ頭いいな
180 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 19:43:18 ] ('A`)に見えた
181 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 19:44:54 ] sizeof に目がなくて
182 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:08:55 ] sizeof('A`)だと8なのでやはり8が答えみたいですね ありがとうございました。
183 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 22:27:13 ] >>182 俺の環境では5になるんだが
184 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 01:13:18 ] なんと… 処理系依存なのでどれも正解ということですか! コードまでご丁寧にありがとうございました。
186 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 09:51:49 ] 処理系というか、自分で決められるといった方が正しい
187 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 11:47:00 ] printf使えば良い
189 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 11:47:45 ] >>187 やったことないけど pinoki.la.coocan.jp/wiki/?Cygwin%2FInstall%2F%C6%FC%CB%DC%B8%EC%B2%BD
190 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 12:08:46 ] >>187 cygwin自体が日本語の入出力をできない状態なら>189へ。 gccのコンパイルオプションについて知りたいならcygwinスレへ。 まぁ、動くかどうかは兎も角scanf()の使い方も間違っているわけだが。 使わないに越したことはないが、scanf("%29s", name)とするのが無難。
191 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 12:11:18 ] 構造体のメンバとローカル変数の配列サイズが違うじゃん。それは拙いっしょ。
192 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 15:24:46 ] プロジェクトのプロパティ→C/C++→コード生成→ランタイムライブラリ を、どれか正しいものに変更する なんか他の外部ライブラリ使ってるだろ?
194 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 15:26:17 ] デバッグ版とリリース版のオブジェクトが混在しているように見える いったんすべてのオブジェクトを削除してビルドしなおせばいい ほかから持ってきたライブラリ結合してるならリンクオプションをそれにあわせる
195 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 06:44:15 ] staticメンバ関数を利用するメリットってあるんでしょうか?
196 名前:195 mailto:sage [2009/02/26(木) 06:51:07 ] すいません スレ移動します
197 名前:195 ◆Ci3UmwhFqY mailto:sage [2009/02/26(木) 07:18:27 ] >>196 は他人です
198 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 10:37:07 ] 何でメリットがないと思ったのか、それが知りたい。
199 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 12:19:36 ] つnew, singleton
200 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 12:23:18 ] コールバック関数のポインタを取るCスタイルのAPIへなんとかしてクラスを配送したいときに
201 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:10:38 ] 文法的にOK
203 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:21:40 ] >>201 class Foo { void Bar(int ptr); }; void Foo::Bar(int const ptr) {} が問題ないのと同じこと。
204 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 02:51:20 ] >>202-203 仮引数にconstをつけるのは実装と宣言で違っても文法的に問題無いのですね。 勉強になりました、ありがとうございました。
205 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:13:20 ] size_t i = N; do { --i; hoge(i); } while (i > 0);
207 名前:206 mailto:sage [2009/02/28(土) 05:14:35 ] ああ、書いてから気づいたけど >>206 は N が初めから 0 だったらダメだね
208 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 05:36:00 ] T i = M; //M = N - 1ということで do { hoge(i); } while (i-- != 0); これだと、MがT型の最大値でも対応できるはず。
209 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 06:46:33 ] >>205 普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど size_tを使う理由が分からない
210 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 08:29:35 ] >>209 メモリのサイズを意味するときはsize_tを使うようにしてる 64ビット環境だとunsigned long longになるのかな
211 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:52:40 ] >>209 > i >= 0; ↑は符合無しだと常に真だろ。
212 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:53:48 ] 何か問題でも?
213 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 11:54:56 ] for (i = 0; i > N; ++i) {;} // ループ中に前後の値が影響しない場合。 if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。 while 系をカウントループに使うのは愚策と考える。
214 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:02:05 ] >>212 やめられない、とまらない
215 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:33:44 ] while(N-->0)は普通に使うだろ --が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん
216 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:39:17 ] その考えはなかった
217 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 12:43:37 ] >>215 そんな餌にクマー まあでも>>205 の要求にあってるしシンプルでわかりやすいな
218 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 13:16:49 ] >>215 ああ、意外と面白い使い方かも・・・ 視覚的にわかり易く書かない場合は >0は書かなくても大丈夫か
219 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:09:16 ] 有名だろ、それ
220 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:16:21 ] ぶっちゃけ初めて見た
221 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:20:36 ] ソース自体は見た事があるような気もするけど、考え方は初めて見た。
222 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 16:14:42 ] 減少していくのに減少していく方向が空いてるのはなんとなく怖いなぁ
223 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:18:11 ] >>215 while(N-->0) って見た目が素敵だな
224 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:23:55 ] AAのプログラム言語とかなら、見た目で分かりやすいかもな・・・
225 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:39:46 ] befungeのことですね!!
226 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 17:41:03 ] 面白そうだけど絶対コーディングしにくいな ほぼ記号だろw
227 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 20:31:33 ] さすがショートコーディングスレ。 ためにな・・・って、あれ?
228 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:45:19 ] 繰り返し処理のことを何ていいますか? 専門的にお願いします。
229 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:49:47 ] 反復処理とか繰り返し処理とか
230 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:00:35 ] 繰り返し処理のことを何ていいますか? 専門的にお願いします。
231 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:01:14 ] 反復処理とか繰り返し処理とか
232 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:38:29 ] >>210 メモリのサイズを入れる型ってsize_t以外になんかなかった?
233 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:50:58 ] 繰り返し処理のことを何ていいますか? 専門的にお願いします。
234 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 20:55:57 ] ループ処理じゃね?w 反復も繰り返しだろうけど、お前は違い分からないだろう
235 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:26:00 ] ぶっちゃけC/C++の話じゃないからスレ違い
236 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:29:11 ] >>234 >>231 >>229 もうちょっとかっこいい言い方あるだろ それを教えろ
237 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:09 ] >>236 死ねハゲ
238 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:31:47 ] 反復処理とか繰り返し処理とか
239 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:47:20 ] リピート
240 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:14:30 ] >>228-231 見事な繰り返し処理 >>232 は空気嫁
241 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:19:39 ] >>232 ssize_tとか、でもCでもC++でも標準ではないけど。
242 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:24:27 ] >>232 ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
243 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:34:14 ] >>241 >>242 そうだな。size_tでよかった。
244 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 05:50:11 ] まだ初心者なのですが、batファイルをC++builder6で ボタンを押したら実行するようにしたいので ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW); と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
245 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:13:52 ] >>244 何故、どう巧くいかないのか書かないのですか?
246 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:28:56 ] 実行はされるのですが(コマンドプロントが一瞬表示される) バッチファイルの中身自体が実行されません;;
247 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 06:39:59 ] batの最後に pause 入れとけ
248 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:00:46 ] >>247 ありがとうございます。 やってみたところ指定されたパスがありませんとのことでした。 普通にbatファイルを起動すると何も問題がないのですが・・・ 原因などわからないでしょうか?
249 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:08:14 ] ファイルパスをちゃんと指定すればいいじゃん・・・
250 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 07:12:19 ] できました! こんな時間に、質問に答えてくださりありがとうございました 大変助かりました。
251 名前:デフォルトの名無しさん [2009/03/03(火) 18:34:32 ] 以下のような感じで「*」の前後にスペースが 入っている場合もポインタの宣言なんでしょうか? static unsigned int * ADDR; スペースが、後だけのもは参考書にも紹介されていますが 前後両方ともスペースのものは見つかりませんでした。 よろしくお願いいたします。
252 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:01:49 ] vector<string> * const (&u)[buf]; // こんな感じですか?
253 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 19:06:04 ] >>251 おんなじ。空白類がいくらあろうと関係ない。
254 名前:デフォルトの名無しさん [2009/03/03(火) 19:47:28 ] >>252 static unsigned int * ADDR; 全くこのままのコードです。 >>253 ご回答有難う御座いました。 もやもやしていましたが、これですっきりしました。
255 名前:デフォルトの名無しさん [2009/03/04(水) 03:11:45 ] VC++9の質問です。Unicode環境で Void Func(LPCSTR pMsg); みたいな関数があって、ここに文字列を渡すのですが、 Func("xxx"); というように普通に書くと問題ないのですが、 Func(_T("xxx")); とやると、 const wchar_t[3] から LPCSTRに変換できません、みたいなエラーが出ます。 全ての文字列を_T("") で括ればいいのかと思ってたのですが、違うのでしょうか?
256 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 03:14:42 ] >>255 _Tで括るのはLPC"T"STRのとき。 LPCSTRはconst char*のtypedefだから_Tは要らない。
257 名前:デフォルトの名無しさん [2009/03/04(水) 03:25:58 ] >>256 なるほど、ありがとうございました。
258 名前:デフォルトの名無しさん [2009/03/04(水) 13:36:24 ] 初歩的過ぎてすいませんが... すでに宣言してある配列の配列数を求めて それと同じ配列数の配列を宣言するには どうすればいいですか? よろしくお願いします。
259 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:39:38 ] >>258 配列数はプログラム書いた人しか知らないから無理 それができたら配列のオーバーフロー管理も楽なんだけど
260 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:44:40 ] >>258 状況がよくわからん
261 名前:259 mailto:sage [2009/03/04(水) 13:44:42 ] sizeof(配列) / sizeof(型) でいいか マクロで定義して同じマクロ使うとか
262 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/03/04(水) 13:53:28 ] すいません言葉が足りなすぎました。。 int a[]= {1,2,...}; size=sizeof(a)/sizeof(a[0]); int b[size]; として同じ配列数の新しい配列を宣言しようとしてもできません。
264 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:56:39 ] C++ なら const int size Cなら int b[sizeof(a)]
265 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:14 ] >>263 size の型は何か 言語をいえ言語を C か C++どっちだ あとCならC89かC99なのか
266 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:57:33 ] >>263 コンパイラも
267 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 14:03:12 ] >>265 C++です。 size の型はintです >>266 gccです。
268 名前:258 mailto:sage [2009/03/04(水) 14:08:43 ] const int size = sizeof(a)/sizeof(a[0]); int b[size]; として宣言できました。 ありがとうございました。
269 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:03:27 ] 配列の要素に変数が使える規格って無かったっけ
270 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 15:30:51 ] >>269 C99だろ
271 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:19:24 ] 連立方程式のを渡したら戻ってくる関数ってありますか?
272 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 17:20:51 ] >>271 標準にはない 標準じゃなくていいならある
273 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 09:53:35 ] assert()と_ASSERT()ってなにか違いがあるのでしょうか?
274 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 10:11:11 ] assertはC/C++標準 結果としてabort() _ASSERTはVC++独自 _CrtSetReportMode等で動作の調整が可能
275 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:14:15 ] メンバ関数のポインタの宣言はCxxx::*funcなのに 取得はCxxx::&funcでなく&Cxxx::funcなの? &がなんで宣言の時の*の位置より移動するの?
276 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:40:47 ] >>275 発想としては、Cxxx::という修飾が メンバへのポインタ型では*にかかっていて、 メンバへのポインタを得るときには、メンバ名funcにかかっている ということのようだ。
277 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:51:32 ] 俺としては逆なんだが なんでCxxx::&funcなの? どこのクラスのメンバ関数のアドレスか分からんが
278 名前:デフォルトの名無しさん [2009/03/05(木) 20:41:28 ] 大変だー さっぱりわからん
279 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:43:44 ] >>278 何が分からないんだかさっぱり分からないぞ
280 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:44:43 ] >>275 単に文法的な曖昧さを除いた結果そうなっただけ。 class A { public: static void (*A::func)(); }; としてしまうと、static メンバ変数の実体定義がこうなってしまう。 void (*A::A::func)(); どっちがどっちの A:: やら分からん。
281 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 21:16:46 ] もうクラスのメンバ関数のポインタは無しで
282 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:09:09 ] 9割くらいBoostやTR1のbind(暗黙のmem_fun)と一緒にしか使わない。
283 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:41:19 ] delegate パターンで使うね
284 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:31:13 ] じゃあdeleteパターンで
285 名前:276 mailto:sage [2009/03/06(金) 19:49:52 ] >>276 , >>280 すみません、レス読んでも、それが 取得はCxxx::&funcでなく&Cxxx::funcなの? の回答になるのか、さっぱり理解できないですが>< あと、&Cxxx::funcは&(Cxxx::func)としては良くないと本に書いてあるんですが なんで良くないんですか?
286 名前:デフォルトの名無しさん [2009/03/06(金) 20:12:15 ] なんか抽象クラスをインスタンス化できないらしいのですがどうすればいいですか? 派生クラスは無いのですが その派生クラスの無い抽象クラスが型な引数をとる関数を使いたいのですが初期化?の方法がわかりません
287 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:16:31 ] >>286 まずは、その抽象クラスへのポインタ型か参照型を引数にしている?
288 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:24:22 ] >>287 ポインタ型を宣言してます、いろいろ上手くいかなかったのでポインタで宣言、元の抽象型で宣言、アドレスをポインタ型に代入→引数に としてます、エラーメッセージはメンバが抽象型です、宣言を確認してください、です
289 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:27:48 ] >>286 派生クラスがない、ではなく、派生クラスは自分で作れということでは?
290 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:29:59 ] ああ、そうかもしれない
291 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:43:25 ] "派生クラスの無い抽象クラスが型な引数をとる関数" これ、抽象クラスのインターフェイスを使って新しいクラスを作れということ
292 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 20:56:18 ] 覚えておきます、ありがとうございました