0

テトリスのリメイクを設計しており、入力関数と同時に実行されるタイマー関数が必要です。これを達成するためにpthreadsを使用していますが、呼び出しを行うと

pthread_create(&timer, NULL, Timer(), NULL);

ヘッダーにpthread_create()含まれているにもかかわらず、呼び出しに一致する関数がないというエラーが表示されます。<pthread.h>

別の人がここでほぼ同じ質問をしていることに気付きました。しかし、その人に提案されたことを何もせずに、別のコンピューターで pthread を作成することに成功しました。

以下は、私が問題を抱えているソースコードです。書き直してくださいと言っているわけではありませんが、何が問題なのか教えてください。コードを修正するために調査を行います。

#include <pthread.h>
#include <iostream>
#include <time.h>

void *Timer(void) { //I have tried moving the asterisk to pretty much every
                    //possible position and with multiple asterisks. Nothing works

    time_t time1, time2;

    time1 = time(NULL);

    while (time2 - time1 <= 1) {
        time2 = time(NULL);
    }

    pthread_exit(NULL);
}

int main() {

    pthread_t inputTimer;

    pthread_create(&inputTimer, NULL, Timer(), NULL); //Error here

    return 0;
}

ありがとうございました

4

2 に答える 2

2

Timer戻り値ではなく、関数のアドレスを渡す必要があります。したがって

pthread_create(&inputTimer, NULL, &Timer, NULL); // These two are equivalent
pthread_create(&inputTimer, NULL, Timer, NULL);

pthread_create3 番目の引数が次の型を持つことを期待しています: void *(*)(void*); つまり、 の引数を 1 つ取り、void*を返す関数void*です。

于 2012-08-15T00:05:36.327 に答える
2

pthread_create呼び出したい関数の戻り値ではなく、呼び出したい関数のアドレスを渡す必要があります。

pthread_create(&inputTimer, NULL, Timer, NULL);

また、関数には次の署名がvoid* (void*)必要なので、次のように変更する必要があります。

void *Timer(void*) {
    time_t time1, time2;
    time1 = time(NULL);
    while (time2 - time1 <= 1) {
        time2 = time(NULL);
    }
    pthread_exit(NULL);
}
于 2012-08-15T00:05:43.910 に答える