過去に近い質問が出ていましたが、探しているような回答が見つからなかったので質問させていただきます。
プログラム作成の過程で_beginthreadを使うことになったのですが、以下のエラーメッセージが表示されます。
error C2664: '_beginthread' : 1 番目の引数を 'void (unsigned long)' から 'void (__cdecl *)(void *)' に変換できません。 (新しい機能 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません
調べた限りC++で作成している為Cでコンパイルされた関数を呼び出す為にC++で指示する必要がある、という事は理解できたのですが、いまいち修正の方法が判りません。
下記に関連部分ソースの一部と開発環境を記載します。
どなたかご教授の方よろしくお願いいたします。
開発環境:Visual C++6.0
プロジェクトの設定でランタイムライブラリはマルチスレッドに設定済み。
WINAPIとして作成、指定URLに接続するためのスレッドを作成したい
-------------------グローバル一部---------------
DWORD cthread=0; //グローバルで宣言している
addurl[1];
-----------問題の処理WndProc内部(メイン部)---------
addurl[0]=url; //編集したアドレスを貼り付け
cthread=_beginthread(OpenURL,0,0); //ここでエラー
-----------送る先(OpenURL)-------------
void __cdecl OpenURL(DWORD index)
{
BASS_StreamFree(chan); // close old stream
SendMessage(Edit,WM_SETTEXT,0,"connecting...");
if (!(chan=BASS_StreamCreateURL(addurl[index],0,BASS_STREAM_META|BASS_STREAM_STATUS,StatusProc,0))) {
SendMessage(Edit,WM_SETTEXT,0,"not playing");
Error("Can't play the stream");
--------------以下省略---------------
No.2ベストアンサー
- 回答日時:
>OpenURLが先に宣言され、最後にWinmainが宣言されています。
今回のトラブルとは関係ないですね。
>dwindexの再定義エラーが出てしまいます。
同じ変数名がでてきているからでしょう。
DWORD* dwindex2 = new DWORD;
*dwindex2 = 0;
cthread=_beginthread(OpenURL,0,&dwindex2);
にしてください。
>できればもうちょっと詳しく説明をいただきたいです。
_beginthreadの引数についてMSDNをみながら理解してください。
1番目の引数は関数ポインタです。
これは void FNC (void* p)という形の関数でなければいけません。
「error C2664:は関数の型が違っている為おきました。」
これはここにvoid FNC (DWORD p)を渡したからおきました。
2番目の引数はスタックサイズです。これは0に設定されていますが
0は特別な値で0を設定すると自動でスタックサイズが決まります。
恐らく2Mがぐらいのスタックが設定されていますが今回は0でかまいません。
(スタックがわからなければ別途しらべてください。)
3番目の引数は
FNCの関数の引数を渡します。関数の型がvoid FNC (void* p)なので
当然void*型でなければなりません。
ちなみに引数がvoid*なのかはわかりますか?
要はvoid*にしておけば配列だろうが構造体だろうが何でも
アドレスで渡せるからそういう仕組みになっているのです。
void FNC (void* p)がもしvoid FNC (char p)
だったとすると
DWORD(unsigned long)を渡す事が出来ないですよね。
でもvoid*であることによって
DWORDだろうが、charだろうがアドレスで渡せるのです。
No.1
- 回答日時:
_beginthreadの
1番目の引数である関数ポインタの型が
違うからです。
void __cdecl OpenURL(DWORD index)
{
を
void __cdecl OpenURL(void* p)
{
DWORD index = *(DWORD*)p;
とすればなおると思います。
'void (unsigned long)'
すなわち
void (DWORD)の関数をvoid(void*)に直せないといっているのです。
呼び出しは
cthread=_beginthread(OpenURL,0,0);
ではなく
DWORD* dwindex = new DWORD;
*dwindex = 0;
cthread=_beginthread(OpenURL,0,&dwindex);
としてスレッド終了時にスレッド側でdeleteするのがよいかと思います。
この回答への補足
説明不足でした。
各コードの実行順番は
OpenURLが先に宣言され、最後にWinmainが宣言されています。
sha-girlさんの方法を試してみましたがdwindexの再定義エラーが出てしまいます。
できればもうちょっと詳しく説明をいただきたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# C言語 3 2022/10/04 15:07
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
VC++でGetKeyboardStateがうま...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
多重定義が起きている?--lnk20...
-
静的でないメンバ関数の呼び出...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
gcc: incompatible pointer type
-
クラス間でのクラスの共有?
-
アドレスを指定して関数を呼び...
-
スレッドの作成について(pthre...
-
コンパイルエラー: LNK2001
-
void*型の配列について
-
AKI-h8 3069f C言語 HEW マイ...
-
const_castのつかいどころを教...
-
static constメンバ変数(配列)...
-
ソケット通信時のWSACleanup処...
-
C言語 プロトタイプ宣言
-
‘*’をツリー状に表示しろという...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報