[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 06/02 12:18 / Filesize : 258 KB / Number-of Response : 992
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.64【環境依存OK】



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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。


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 ]
圧縮アルゴリズムおもろいよ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef