5

引数を渡すためのパラメーターとしてを受け取るコールバック関数がありvoid *、関数にベクトルを渡したいと思います。関数は複数回呼び出されるので、コールバックプロセスが完了した後、コールバックを介して実行されたすべての要素を反復処理できるようにしたいと思いpush_back()ます。

static void cb(void *data)
{
    vector<int> *p = static_cast<vector<int>*>(data); //Attempting to convert *void to vector<int>
    p->push_back(1);
}

int main()
{
    vector<int> a(10); //Max of 10 push_back()s? vector<int> a; gives memory error.
    cb((void*)&a.at(0));
    cout << a.at(0); //Gives a random number of 6 digits or higher
}

問題は、コールバック後に呼び出されたときに値が「1」a.at(0)ではなく、乱数だけであるということです。

4

3 に答える 3

5

の署名を変更できないと仮定して、次のことをcb()試してください。

cb(static_cast<void*>(&a));
于 2013-02-12T04:18:21.760 に答える
3

ここ:

cb ((void*)&a.at(0));

ベクトル自体ではなく、ベクトルの最初の要素へのポインターを渡しますが、ここでは次のようになります。

vector <int> *p = static_cast <vector <int> *> (data);

渡されたデータをベクトルへのポインターにキャストしますが、これはおそらく未定義の動作です。ベクトル全体へのポインタを渡したい場合は、次のように渡します。

cb ((void *)&a);

ベクトルの要素へのポインタを本当に渡したい場合は、次のようにキャストする必要があります。

int * = static_cast <int *> (data);
于 2013-02-12T04:22:13.980 に答える
3

C ++ 11では、次のようになりますvector::data

cb(a.data());
于 2015-08-20T11:37:32.637 に答える