スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/
19 http://hibari.2ch.net/test/read.cgi/tech/1308106024/
20 http://toro.2ch.net/test/read.cgi/tech/1316013463/
21 http://toro.2ch.net/test/read.cgi/tech/1342285511/
22 http://peace.2ch.net/test/read.cgi/tech/1399911167/
23 http://peace.2ch.net/test/read.cgi/tech/1420379468/
24 http://echo.2ch.net/test/read.cgi/tech/1448685034/
探検
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
2016/08/14(日) 00:04:05.53ID:z6U1tRVC
2016/08/17(水) 13:13:38.39ID:rz4OYI8a
関数にstaticをつける必要がある場合その関数を仮想関数みたいに使うにはどうすればいいかな?
例えばSetTimerで指定する関数を派生クラス毎の機能にしたい
基底クラスでstatic付きの関数を定義して
その中でpublicな仮想関数を呼ぶとかがスマートなんかな?
例えばSetTimerで指定する関数を派生クラス毎の機能にしたい
基底クラスでstatic付きの関数を定義して
その中でpublicな仮想関数を呼ぶとかがスマートなんかな?
2016/08/17(水) 22:18:06.51ID:KqRj7kcI
基本部分の知識不足か説明不足で要領をえないな
> 関数にstaticをつける必要がある場合その関数を仮想関数みたいに使うにはどうすればいいかな?
そんなことをやろうとしなくても
派生クラス毎にstaticな関数を用意してSetTimerを呼び出すときにそれを登録すればいいだけでは
> 関数にstaticをつける必要がある場合その関数を仮想関数みたいに使うにはどうすればいいかな?
そんなことをやろうとしなくても
派生クラス毎にstaticな関数を用意してSetTimerを呼び出すときにそれを登録すればいいだけでは
2016/08/18(木) 08:40:43.37ID:nfE+KhhQ
>>3
別のstatic関数にthisポインタを保持させておいて
1回目のTimerでその関数を呼んでTimer内のstatic変数に保存したら
publicなら呼べると思ったけど
そうするのがいいんかなありがとう
別のstatic関数にthisポインタを保持させておいて
1回目のTimerでその関数を呼んでTimer内のstatic変数に保存したら
publicなら呼べると思ったけど
そうするのがいいんかなありがとう
2016/08/18(木) 17:06:15.70ID:9gCEAov3
いや言っている意味がよくわからんがこういう感じのじゃダメなの?
やりたいことがわからんからコールバック呼ばれたらKillTimerしちゃってるけど…
それともTimerProcAやTimerProcBでclass A や class B のメンバにアクセスしたいという感じ?
class A
{
private:
static void TimerProcA(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); }
public:
A(){}
~A(){}
virtual void TimerCall(){ SetTimer(NULL,0,2000,(TIMERPROC)TimerProcA); }
};
class B : public A
private:
static void TimerProcB(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); }
public:
A(){}
~A(){}
virtual void TimerCall(){ SetTimer(NULL,0,4000,(TIMERPROC)TimerProcB); }
};
やりたいことがわからんからコールバック呼ばれたらKillTimerしちゃってるけど…
それともTimerProcAやTimerProcBでclass A や class B のメンバにアクセスしたいという感じ?
class A
{
private:
static void TimerProcA(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); }
public:
A(){}
~A(){}
virtual void TimerCall(){ SetTimer(NULL,0,2000,(TIMERPROC)TimerProcA); }
};
class B : public A
private:
static void TimerProcB(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime){ KillTimer(NULL,idEvent); }
public:
A(){}
~A(){}
virtual void TimerCall(){ SetTimer(NULL,0,4000,(TIMERPROC)TimerProcB); }
};
2016/08/18(木) 17:26:00.93ID:nfE+KhhQ
そうそうアクセスしたいという感じ
別のstatic関数ってのはこんな感じでTimerProcからメンバにアクセスするためにクラスポインタを保持させてて
static void *func(void *p) {
static void *q;
if(p != NULL) {
q = p;
}
return q;
}
使う時はこんな感じ
TimerProc() {
static ClassA *classpointer;
if(classpointer == NULL) {
classpointer = func(NULL);
}
// 以下classpointerを使った処理を仮想関数にできればと思った
}
けど基底クラスのTimerProcでは派生クラスの型がわからんし無理だと気付いたごめん
別のstatic関数ってのはこんな感じでTimerProcからメンバにアクセスするためにクラスポインタを保持させてて
static void *func(void *p) {
static void *q;
if(p != NULL) {
q = p;
}
return q;
}
使う時はこんな感じ
TimerProc() {
static ClassA *classpointer;
if(classpointer == NULL) {
classpointer = func(NULL);
}
// 以下classpointerを使った処理を仮想関数にできればと思った
}
けど基底クラスのTimerProcでは派生クラスの型がわからんし無理だと気付いたごめん
2016/08/18(木) 17:28:17.52ID:9gCEAov3
あちゃー
クラスBのコンストラクタとデストラクタは脳内で変換しておいてください
それならstd::mapとか使って…
要点だけなのでエラー処理とかは無しだけど
std::map<UINT, void*> mp;
class A
{
public:
A(){}
~A(){}
static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
KillTimer(NULL,idEvent); A *a=(A*) mp[idEvent]; mp.erase(idEvent); a->TimerCallbackEvent();
}
void TimerCall(){ UINT TimerId = SetTimer(NULL,0,2000,(TIMERPROC)TimerProc); mp[TimerId] = this; }
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); }
};
class B : public A
{
public:
B(){}
~B(){}
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); }
};
クラスBのコンストラクタとデストラクタは脳内で変換しておいてください
それならstd::mapとか使って…
要点だけなのでエラー処理とかは無しだけど
std::map<UINT, void*> mp;
class A
{
public:
A(){}
~A(){}
static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
KillTimer(NULL,idEvent); A *a=(A*) mp[idEvent]; mp.erase(idEvent); a->TimerCallbackEvent();
}
void TimerCall(){ UINT TimerId = SetTimer(NULL,0,2000,(TIMERPROC)TimerProc); mp[TimerId] = this; }
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); }
};
class B : public A
{
public:
B(){}
~B(){}
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); }
};
2016/08/18(木) 17:37:35.78ID:9gCEAov3
別にstd::mapである必要はないし独自のリストを作っても良い
TimerProc() と TimerCall() は基底クラスだけ書く
TimerCallbackEvent()は仮想関数で 派生クラス毎の機能 はここに書く
流れとしてはそれぞれのクラスでTimerCall() を呼び出すとタイマIDとインスタンスをセットで登録
時間経過でTimerProc()が呼ばれるけどその際に登録したタイマIDからインスタンスをゲット
あとはインスタンスの仮想関数 TimerCallbackEvent() を呼び出す
TimerProc() と TimerCall() は基底クラスだけ書く
TimerCallbackEvent()は仮想関数で 派生クラス毎の機能 はここに書く
流れとしてはそれぞれのクラスでTimerCall() を呼び出すとタイマIDとインスタンスをセットで登録
時間経過でTimerProc()が呼ばれるけどその際に登録したタイマIDからインスタンスをゲット
あとはインスタンスの仮想関数 TimerCallbackEvent() を呼び出す
2016/08/18(木) 18:02:11.11ID:9gCEAov3
あと横着なやり方だと
SetTimerにウインドウハンドル指定すれば第二引数の UINT idTimer を有効に出来る
この idTimer にクラスのインスタンスを指定
コールバック関数 TimerProc では 第三引数の UINT idEvent, をクラスの型にキャストしてインスタンスを取得
class A
{
public:
A(){}
~A(){}
static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) {
KillTimer(hwnd, idEvent); A *a=(A*) idEvent; a->TimerCallbackEvent();
}
void TimerCall(HWND hWnd){ SetTimer(hWnd,(UINT)this,2000,(TIMERPROC)TimerProc); }
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); }
};
class B : public A
{
public:
B() : A(){}
~B(){}
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); }
};
SetTimerにウインドウハンドル指定すれば第二引数の UINT idTimer を有効に出来る
この idTimer にクラスのインスタンスを指定
コールバック関数 TimerProc では 第三引数の UINT idEvent, をクラスの型にキャストしてインスタンスを取得
class A
{
public:
A(){}
~A(){}
static void TimerProc(HANDLE hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) {
KillTimer(hwnd, idEvent); A *a=(A*) idEvent; a->TimerCallbackEvent();
}
void TimerCall(HWND hWnd){ SetTimer(hWnd,(UINT)this,2000,(TIMERPROC)TimerProc); }
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer A","TEST",MB_OK); }
};
class B : public A
{
public:
B() : A(){}
~B(){}
virtual void TimerCallbackEvent(){ MessageBox(NULL,"Timer B","TEST",MB_OK); }
};
2016/08/18(木) 19:33:04.64ID:nfE+KhhQ
2016/08/31(水) 13:39:09.46ID:HrKErv9D
苦C12-2の戻り値になんでcount付くの?
2016/09/01(木) 12:44:39.61ID:Cb20qd0C
Class A { int a }
Class B { int a }
Class C : A, B { } // A Bを継承
この状態だとCからaにアクセスする場合は
thisじゃどっちのaだよってなるから
A::a, B::aってやる必要があるけど
Class C { A a; B b; } // A Bを宣言
これと違う部分は
名前が衝突するかしないかだけ?
Class B { int a }
Class C : A, B { } // A Bを継承
この状態だとCからaにアクセスする場合は
thisじゃどっちのaだよってなるから
A::a, B::aってやる必要があるけど
Class C { A a; B b; } // A Bを宣言
これと違う部分は
名前が衝突するかしないかだけ?
2016/09/01(木) 14:07:11.55ID:h0ZxBZjb
コンパイルが通る文法でやり直し
2016/09/01(木) 18:20:52.36ID:9l469SL1
>>12
コンストラクタやデストラクタのタイミングから考えれば両者は別物
例えばCの初期化時、CのメンバがAやBにアクセスする場合
前者は問題なくCのメンバは初期化されるが
後者は宣言の位置によって未初期化データにアクセスする危険がある
前者はCをAとしてみることが出来るし、CをBとしてみることも出来る
でも後者においてCはCでしかない
例えばAを必要とする関数とBを必要とする関数がある場合、
前者はそのままCを引数に渡せるが後者は適宜メンバを指定しないといけない
もっともオーバーロードされた関数だとCをAかBにキャストしてやんないと曖昧だと怒られる
もちろん適切に宣言されていることは前提
コンストラクタやデストラクタのタイミングから考えれば両者は別物
例えばCの初期化時、CのメンバがAやBにアクセスする場合
前者は問題なくCのメンバは初期化されるが
後者は宣言の位置によって未初期化データにアクセスする危険がある
前者はCをAとしてみることが出来るし、CをBとしてみることも出来る
でも後者においてCはCでしかない
例えばAを必要とする関数とBを必要とする関数がある場合、
前者はそのままCを引数に渡せるが後者は適宜メンバを指定しないといけない
もっともオーバーロードされた関数だとCをAかBにキャストしてやんないと曖昧だと怒られる
もちろん適切に宣言されていることは前提
2016/09/01(木) 18:26:02.24ID:9l469SL1
2016/09/01(木) 18:51:52.00ID:Cb20qd0C
>>15
詳しくありがとう
詳しくありがとう
2016/09/06(火) 13:37:22.26ID:71dTDxcx
int型aに自然数を入力するとする
√aに最も近い分数を表示する(ただし分子分母はそれぞれ5桁以内)
例えば√2の場合は30547/21600
ってプログラム作りたいなと思ったんですけどなかなか上手くいかないです
何かアドバイスありませんか??
√aに最も近い分数を表示する(ただし分子分母はそれぞれ5桁以内)
例えば√2の場合は30547/21600
ってプログラム作りたいなと思ったんですけどなかなか上手くいかないです
何かアドバイスありませんか??
2016/09/06(火) 14:06:14.75ID:7STKxdhD
君がすでに試したことをアドバイスして、もうやりました、と返されるのはばかばしいだろ
本気でアドバイスが欲しければ君がこれまでにやったが満足出来なかったこと
やろうとしたけどうまくできなかったこと、とかをできるだけ多く伝えてからにするんだな
本気でアドバイスが欲しければ君がこれまでにやったが満足出来なかったこと
やろうとしたけどうまくできなかったこと、とかをできるだけ多く伝えてからにするんだな
2016/09/06(火) 21:30:24.59ID:Phz+5l1v
分母を1から99999まで回して√2に掛け小数点を切り上げた時と切り捨てた時で最も誤差が小さくかつ1から99999の範囲にある値を分子にする
2016/09/07(水) 09:32:39.46ID:mdJXQRTa
sqrt(2)は、66922/47321じゃない?
2016/09/07(水) 13:34:29.16ID:r09HpaM4
sqrt(n)の結果を分数に変換すれば良いならググれば出てくると思うが。
割と簡単だぞ。
割と簡単だぞ。
2016/09/07(水) 14:15:36.07ID:M2bjXbVq
2016/09/07(水) 19:10:24.68ID:9ei6Qh2k
>>17 の問題は、平方根の近似値を求めることと
桁数制限のある分子・分母による分数で小数の近似値を作ること、
この2つに分解できるのかな。それとも一体なんだろうか。
ちょいと調べたところ「ディオファントス近似」とかいう
数学のキーワードが出てきたから、C/C++のプログラムというより
アルゴリズムの問題なのかもしれないよ。
桁数制限のある分子・分母による分数で小数の近似値を作ること、
この2つに分解できるのかな。それとも一体なんだろうか。
ちょいと調べたところ「ディオファントス近似」とかいう
数学のキーワードが出てきたから、C/C++のプログラムというより
アルゴリズムの問題なのかもしれないよ。
2016/11/17(木) 19:27:03.23ID:/ZwpQAJu
http://www.boost.org/doc/libs/1_53_0/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_cuda__or_openmp__tbb_______via_thrust.html
CUDAの
__host__ __device__
value_type operator()( value_type x) const
{
みたいな書き方で
__host__ __device__
というのはCUDAに限定された書き方で普通のC++では返り値の方の前に
他のもの置けませんよね?
CUDAの
__host__ __device__
value_type operator()( value_type x) const
{
みたいな書き方で
__host__ __device__
というのはCUDAに限定された書き方で普通のC++では返り値の方の前に
他のもの置けませんよね?
2016/11/17(木) 19:31:08.07ID:cH0vE1/X
staticとか置けるよ
2016/11/17(木) 20:52:01.53ID:klz7wxCT
cdeclとかstdcallとか置かない?
2016/11/17(木) 20:52:40.98ID:dEDc58kY
環境に応じて空白に置換されることもあるマクロとか普通に置けるし
C++11以降なら普通にattributeを置ける
C++11以降なら普通にattributeを置ける
2016/11/18(金) 09:34:37.20ID:HWQGR5IS
>>26
void __stdcall func();だわ
void __stdcall func();だわ
2016/12/25(日) 17:25:21.30ID:+uAMo6Z3
c++11 の std::accumulate() を使って CRC32 を計算するプログラムを書いているんだけど、
イテレータの型が不明だから template<> を使わざるおえずヘッダーにしか書けないんだよな。
それは仕方がないとして、参照しているテーブルをヘッダーファイルに
static const uint32_t __CRC32_TABLE__[256] {/* データは省略 */};
って書いてもコンパイル単位で毎回生成されるようなことにはならないのか心配。
自分で調べてみようと思って objdump を使って見てみたんだけどよくわからんかった。
extern で宣言して別ファイルでテーブルの実態を定義してもいいけど、
シンボルを公開したくないんだよね。
イテレータの型が不明だから template<> を使わざるおえずヘッダーにしか書けないんだよな。
それは仕方がないとして、参照しているテーブルをヘッダーファイルに
static const uint32_t __CRC32_TABLE__[256] {/* データは省略 */};
って書いてもコンパイル単位で毎回生成されるようなことにはならないのか心配。
自分で調べてみようと思って objdump を使って見てみたんだけどよくわからんかった。
extern で宣言して別ファイルでテーブルの実態を定義してもいいけど、
シンボルを公開したくないんだよね。
レスを投稿する
ニュース
- 【無言】中国怒らせた高市首相→1週間だんまり、国民に実害も説明なし 中国問題を避けてスルー… ★2 [BFU★]
- 止まらぬ「日本売り」 高市財政への懸念で進む金利上昇と円安 [蚤の市★]
- 【いちご高騰】ヤマザキのクリスマスケーキ、いちご無し販売 [おっさん友の会★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★10 [樽悶★]
- 【日中対立】 朝日新聞のタイトル修正が中国逆ギレの火種か SNSで批判相次ぐ [♪♪♪★]
- 【MLB】ドジャース・山本由伸と渦中の村上宗隆が会食 米メディア騒然 「村上と大谷翔平が同じ打線に並ぶ姿を想像してみてほしい」 [冬月記者★]
- 中国「高市が謝罪しなければ、ハニトラに引っかかった日本の政治家を公表する」 [804169411]
- 最近気付いたんだけど俺肉の味じゃなくて塩味と食感で米食ってた
- 将来ラーメン屋しか職がなかったらどうする?
- 【実況】博衣こよりのえちえちカービィのエアライダー🧪★2
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【35🌸専】なんG さくらみこ桃鉄配信実況スレ🏡【ホロライブ▶】
