C2664 エラー – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] C2664 エラー

固定ページ 2 / 2

たろう
 たろう
(@たろう)
ゲスト
結合: 25年前
投稿: 51
Topic starter  

気になったので再度
グローバルでやってみたら出来ました。

unsigned __stdcall counter(void *arg);

unsigned __stdcall counter(void *arg)
{
return(0);
}

void CN_ThreadView::OnAthread()
{
int thread_id1;
unsigned dummy;

thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
}

nさん, monkeyさんどうもお手数をお掛けしました。

理由は
>クラスのメンバ関数の場合はこういったコールバック関数にすることはできないので、
staticにする必要があります。
>スレッドに渡すコールバック関数は,staticメンバ
関数にするか,グローバル関数にする必要があります
だったんですね(でも何でかが分からないのですが先にすすみます)


返信引用
たろう
 たろう
(@たろう)
ゲスト
結合: 25年前
投稿: 51
Topic starter  

解決です
どうも


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

> (でも何でかが分からないのですが先にすすみます)
それは、大変、やめたほうがいいと思います。

後々怖いので、聞かれてませんが何でだか解説しておきますと…

> thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
ここで渡してる counter ってのは、それが static かグローバルならば、プログラム中
に一つしかありませんから、アドレスを特定することが可能です。
でも、static でないメンバ関数の場合、counter 関数は CN_ThreadView クラスのイン
スタンスの数だけ存在しますから、どのアドレスを取ったらいいかわかりません。
で、エラーっちゃうわけです。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>でも、static でないメンバ関数の場合、counter 関数は CN_ThreadView クラスのイン
>スタンスの数だけ存在しますから、どのアドレスを取ったらいいかわかりません。

シャノンさん、うそ(間違ったこと)教えちゃいけません
非スタチックなメンバー函数(かんすう)がインスタンスの数だけあったら、リンカーは
どうやって区別したらいいんですか?
非スタチックなメンバー函数はどのインスタンスかを知らせるために、コンパイラーが
this ポインターを(コンパイル時に)渡すようにコードを生成するので、どのインスタンス
を扱うか知ることが出来るのです。ところが、 Windows API は C++ のことなど知りません
から(言語依存ではないので) C++ の非スタチックなメンバー函数が函数ポインターとして
渡って来てもどのインスタンスかについて知らないので呼び出せないということなのです


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

なんだかわからないので先に進みますはやめましょう。
後で大ハマリする原因です。
納得できるまで食い下がっとかないと痛い目を見るのは自分ですから。

どうも、C++の知識が足りないように感じます。
出来れば、C++の勉強からはじめた方が良いですよ。
MFCを使わないコンソールアプリケーションなどを使って
C++の入門書で勉強してみてはどうですか?
間違ってもVC++の入門書で勉強したりしないようにしましょう。
開発環境の入門書を使っても言語の勉強は出来ません。

追伸
「シャノンさん、うそ(間違ったこと)教えちゃいけません」
これは言いすぎかなと思いますよ。
誰にでも勘違いはありますから。

「シャノンさん、それは間違ってますよ。」
で十分だと思います。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

あら、タイプミス。

>なんだかわからないので先に進みますはやめましょう。

なんだかわからないのですが先に進みますはやめましょう。

です。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

> これは言いすぎかなと思いますよ。
構いませんよ。間違ったことを教えようとしてたのは確かです。
嘘をついた覚えはありませんが…

#無知は無罪でも、知ったかぶりは罪です(法律的にとかじゃなくてね)

「よーし、インスタンスの数だけあるかどうか確かめてやろうじゃないか」

#include <iostream>

class Test
{
public:
void PrintMemberFunctionAddress()
{
void ( Test::*pFunc )() = &Test::PrintMemberFunctionAddress;
std::cout << pFunc << std::endl;
}
};

int main()
{
Test test[ 5 ];

for( int i = 0; i < 5; i++ )
{
test[ i ].PrintMemberFunctionAddress();
}

return 0;
}

結果:
1
1
1
1
1

確かにメンバ関数のアドレスは全部同じ。実体は一つなのか…
「でも 1 って何ー!?」

> どうも、C++の知識が足りないように感じます。
まったくです>俺


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

>「でも 1 って何ー!?」

メンバ関数のポインタ配列がどこかに置かれてて、そのインデックスなのかも…?


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

雑談板でちょっとまえに話題に上がったけど、
スレ乗っ取りはよろしくないので雑談板に移動させていただきます。
このスレ本来の話題ではなく、俺っちのカキコにレスくださるかたはあちらへ…


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました