1

WaitAndCallFunc()関数内でTest1()メソッドを呼び出したいと思いました。

コード:

typedef void (*func)();

void StartTimer(void* pFuncAddr);
void WaitAndCallFunc(void* pPtr);

void WaitAndCallFunc(void* pPtr)
{
    int i = 0;
    int nWaitTime = 3;

    while(1)
    {
        Sleep(1000);
    //  I want pPtr to call Test1 Function;
        if(i == nWaitTime)
            break;
    }

    _endthread();
}
void StartTimer(void* pFuncAddr)
{
    _beginthread(WaitAndCallFunc, 0, pFuncAddr);
}
void Test1();
int main(int argc, char* argv[])
{

    StartTimer(Test1);

    Sleep(5000);

    return 0;
}

void Test1()
{
    cout << "Testing Thread\n";
}
4

4 に答える 4

5

あなたの質問が正確に何であるかわかりませんが、これを試してください:

((func)pPtr)();
于 2009-07-08T12:28:11.240 に答える
3

キャストして電話する:

typedef void (*func)();

void WaitAndCallFunc(void* pPtr)
{
    int i = 0;
    int nWaitTime = 3;

    while(1)
    {
        Sleep(1000);

        func f=(func)pPtr;   // cast to correct pointer to function type
        f();                 // and call!

        if(i == nWaitTime)
                break;
    }

    _endthread();
}
于 2009-07-08T12:26:20.053 に答える
3

厳密には、C では、関数ポインターと他の型のポインターとの間で変換することは想定されていません。期待どおりに動作することを保証するものではありません。

したがって、より衒学的に正しいバージョンは次のようになります。

struct hook {
    void (*func)();
};

void StartTimer(void* pFuncAddr);
void WaitAndCallFunc(void* pPtr);

void WaitAndCallFunc(void* pPtr)
{
    struct hook *hook_ptr = pPtr;

    hook_ptr->func();

    _endthread();
}

void StartTimer(void* pFuncAddr)
{
    _beginthread(WaitAndCallFunc, 0, pFuncAddr);
}

void Test1();

int main(int argc, char* argv[])
{
    struct hook hook_test1 = { &Test1 };

    StartTimer(&hook_test1);

    Sleep(5000);

    return 0;
}

これは、関数ポインター自体ではなく、void * との間でキャストされる構造体ポインターであることに注意してください。これには、Test1() に値を渡す必要がある場合に、さらにいくつかの値を構造体に詰め込むことができるという利点もあります。

于 2009-07-08T13:41:11.263 に答える
2

実際には、関数ポインタを void* に、または void* を関数ポインタに変換することは、現在の C または C++ では直接許可されていません (ほとんどのコンパイラがコンパイルしますが)。

直接キャストをコンパイルしないコンパイラで (C 構文を使用して) 前後に変換するには、次の 2 つの方法があります。

方法 1 (最初に統合仲介に変換)

((func) (intptr_t) pPtr)();  // call the void*

StartTimer( (void*) (intptr_t) &Test1); // pass function pointer to void*

方法 2 (void** を使用)

func f = 0;
*((void**)&f) = pPtr;
f();  

StartTimer( *((void**) &Test1)); // pass function pointer to void*

詳細については、次のスレッドを参照してください: C++ での関数ポインターのキャスト

于 2009-07-08T13:43:28.500 に答える