9

pthread_create() を使用しようとしていますが、常にこのエラー無効な変換が表示void*されますvoid* ( * )(void*)

このエラーは 3 番目の引数にあります。誰かがこのエラーで私を助けてくれますか?

void Print_data(void *ptr) {
    cout<<"Time of Week = " <<std::dec<<iTOW<<" seconds"<<endl;
    cout<<"Longitude = "<<lon<<" degree"<<endl;
    cout<<"Latitude  = "<<lat<<" degree"<<endl;
    cout<<"Height Above Sea = "<<alt_MSL<<" meters"<<endl;    
  }

int call_thread() 
  {
    pthread_create(&thread, NULL, (void *) &Print_data, NULL);
    return 0;
  }
4

5 に答える 5

18

エラーは、関数ポインタ ( void* (*)(void*)) をオブジェクト ポインタ ( void*)に変換しようとしているのにpthread_create、その引数に関数ポインタが必要であることです。あなたが行った危険な変換を元に戻すための暗黙的な変換はないため、エラーが発生します。

答えはそうしないことです:

pthread_create(&thread, NULL, &Print_data, NULL);

また、Posix スレッド インターフェイスに一致するようPrint_dataに戻るように変更する必要があります。void*

void *Print_data(void *ptr) {
    // print stuff
    return NULL;  // or some other return value if appropriate
}

コメントに記載されているように、この C ライブラリを C++ から直接使用することには、他にもさまざまな問題があります。特に、移植性のために、スレッド エントリ関数はextern "C". 個人的には、標準の C++ スレッド ライブラリ (または、2011 年より前のバージョンの言語で行き詰まっている場合は Boost の実装) を使用することをお勧めします。

于 2013-06-17T12:39:44.153 に答える
3

pthread_create3 番目の引数を

int pthread_create(pthread_t *thread,
                   const pthread_attr_t *attr,
                   void *(*start_routine)(void*),
                   void *arg);

これvoid *(*start_routine)(void*)は、ポインターを受け取り、void*ポインターを返す関数へのvoid*ポインターです。

ポインターを&Print_dataに変換すると、[関数ポインター]型のポインターではなく、void *型のポインターを渡すことになります。void*void *(*start_routine)(void*)

正しくするには、戻り値の型を asvoid*にし、呼び出しを as にする必要がありますpthread_create(&thread, NULL, &Print_data, NULL);

于 2013-06-17T12:45:30.753 に答える
2

あなたは帰らなければなりませんvoid*

void* Print_data(void *ptr) {

ニーズを満たすために。

渡す関数のシグネチャは

void* function(void*);

pthread_create次に、を使用して呼び出します

 pthread_create(&thread, NULL, &Print_data, NULL);
于 2013-06-17T12:39:08.200 に答える
0

ヘッダー ファイル #include を追加し、g++ -lpthread をコンパイルします。

于 2016-05-27T11:19:46.497 に答える