C2664 エラー – プログラミング – Home

通知
すべてクリア

[解決済] C2664 エラー

固定ページ 1 / 2

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

下記のコードでC2664エラーが発生します
(VC++6.0 SP6)

unsigned _stdcall ****::counter(void *arg)
{
// 簡単なタイマー
return(0);
}
void ****::OnAthread()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
int thread_id1;
unsigned dummy;

// 省略
thread_id1=_beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
// 省略

}
--- error ----------------------
\*****.cpp(171) : error C2664: '_beginthreadex' : 3 番目の引数を 'unsigned int
(void *)' から
'unsigned int (__stdcall *)(void *)' に変換できません。 (新しい機能 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。

このエラーが解決できません。
*.c ではとおるのですが *.cpp ではエラーになります
すみませんが宜しくお願い致します。


引用未解決
トピックタグ
monkey
 monkey
(@monkey)
ゲスト
結合: 21年前
投稿: 70
 

関数counterの型が_beginthreadex関数の第3引数の型と一致していないというエラーで
す.

# エラーメッセージのとおりなんだけどなぁ


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

counter だと「関数へのポインタ」 が式の値になり、
counter() とすれば関数の「戻り値」 が式の値になります。


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

あ、スレッドか。失礼。


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

どうもレス有難うございます

*.c だと OK なんですけ?
エラーメッセージとうりなんですけど、何で見つからないのか?
countは1個しかないんでけど
宜しくお願い致します。


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

cだと::なんて通らないですよね?
コードとエラー内容とが違ってないですか?


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

こんにちわ
VC++用に書き換えたんです
VC++で実行したかったので。

*c だと下記のようになります。
これは OKなんですが?

#include <stdio.h> /* VC では使用してない */
#include <sys/types.h>
#include <process.h>
#include <windows.h>  /* VC では使用してない */

unsigned _stdcall counter(void *arg)
{
    /* 略 */

return(0);
}
void main()
{

int thread_id1;
unsigned dummy;

/* 略 */
thread_id1= _beginthreadex(NULL,0,counter,(void *)1,0,&dummy);
/* */
}
よろしくお願いします。


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

ついか

を使用するので
プロジェクトの設定の中のC/C++の項目の
プロジェクトオプションで /MT を追加してます
宜しくお願いします


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

> 'unsigned int (__stdcall X::*)(void *)' から…に変換することはできません
^^^
エラーメッセージはこう↑じゃなかったですか?(Xはクラス名)

クラスのメンバ関数の場合はこういったコールバック関数にすることはできないので、
staticにする必要があります。


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

たびたびすみません

error C2664: '_beginthreadex' : 3 番目の引数を 'unsigned int (void *)' か
ら 'unsigned int (__stdcall *)(void *)' に変換できません。

となってます


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

unsigned __stdcall Func( void* )
^^^^^^^^^
という風にすればOKでは。


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

申し訳ない.なんか勘違いしてました.
他の方がおっしゃっているように,スレッドに渡すコールバック関数は,staticメンバ
関数にするか,グローバル関数にする必要があります.


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

こんばんわ

nさん、monkeyさん
レス有難うございます
ご指摘の内容でやってみたのですが、変化はありませんでした。
static関数,グローバルでやってみようと思います。
今日は遅くなってので後日、トライして結果を報告します。

でも、IEで検索していたのでがなんとなく難しそう。


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

ついか
ちなみに他の部分が悪さしてるかと思い
他を全部削って下記の内容でやってみたのですが、同じエラーでした
くたびれた一日でした ^^;

#include <sys/types.h>
#include <process.h>

--- *.h -----
class CN_ThreadView : public CScrollView
{
public:
unsigned __stdcall counter(void *arg);
以下略
}

--- prg -----
unsigned __stdcall CN_ThreadView::counter(void *arg)
{
return(0);
}

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

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


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

> static関数,グローバルでやってみようと思います。
> でも、IEで検索していたのでがなんとなく難しそう。

どーってことはないですよ。

> --- *.h -----
> class CN_ThreadView : public CScrollView
> {
> public:
> unsigned __stdcall counter(void *arg);
> 以下略
> }

static unsigned __stdcall counter(void *arg);
ってするだけです。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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