1

私は、スレッド ライブラリを構築する必要がある学校の課題に取り組んでいます。pc指定された Thread オブジェクトのrun()関数のアドレスを保持する必要があります。address_tメンバー関数ポインター(実際には unsigned long int) をキャストしようとすると、このエラーが発生します

../main.cpp: 関数 'void setup(Thread&)' 内:

../main.cpp:77:22: エラー: 型 'int (Thread::*)()' から型 'address_t {aka unsigned int}' へのキャストが無効です</p>

make: * [main.o] エラー 1

エラーが発生する関数は次のとおりです。

void setup(Thread &thread)
{
    address_t sp, pc;

    sp = (address_t)stack1 + STACK_SIZE - sizeof(address_t);
    int (Thread::*temp)() = &Thread::run;
    pc = (address_t) temp; // @@ LINE 77 @@

    sigsetjmp(jbuf[0],1);
    (jbuf[0]->__jmpbuf)[JB_SP] = translate_address(sp);
    (jbuf[0]->__jmpbuf)[JB_PC] = translate_address(pc);
    sigemptyset(&jbuf[0]->__saved_mask);
}

いくつかの説明:

スレッドは私が書いたクラスで、現在何もしていません。それはint run(void)その「主な」機能として。address_t、私が言ったように、typedef unsigned long int

なぜこのエラーが発生するのかについてのアイデアはありますか? ありがとう

4

2 に答える 2

4

私はあなたがそれを行うことができるとは思わない.

void ポインターはデータへのポインターであり、関数ポインターは関数を指します。この言語では、関数とデータが同じアドレス空間にある必要はありません。そのため、限定ではなく例として、それらが異なるアドレス空間にあるアーキテクチャでは、2 つの異なるポインター型は比較できません。

この素敵な FAQをご覧ください。に変換できない場合は、またはvoid*に変換できません。intlong int

于 2012-04-21T12:26:04.437 に答える
1

これは2つの理由で機能しません:

  1. void*関数ポインタは(UmNyobeの答えを参照)と互換性がありません。
  2. メンバー関数をスレッドエントリとして使用するには、thisポインタも格納する必要があります。

C ++を使用しているので、いくつかの可能性があります。

  1. thread_base仮想関数をスレッドエントリポイントとして定義する基本クラスを使用します。
  2. スレッドエントリポイントとしてファンクターを使用します。

いずれの場合も、この情報をどこかに保存し、オペレーティングシステムのスレッドライブラリを使用して呼び出す必要があります。

于 2012-04-21T12:30:04.477 に答える