У меня есть функция обратного вызова, которая принимает 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)
вызывается после обратного вызова, просто какое-то случайное число.
Предполагая, что вы не можете изменить подпись cb()
, попробуй это:
cb(static_cast<void*>(&a));
Вот:
cb ((void*)&a.at(0));
Вы передаете указатель на первый элемент вектора, а не на сам вектор, но здесь:
vector <int> *p = static_cast <vector <int> *> (data);
Вы передаете переданные данные указателю на вектор, что, вероятно, является неопределенным поведением. Если вы хотите передать указатель на весь вектор, передайте так:
cb ((void *)&a);
Если вы действительно хотите передать указатель на элемент вектора, то вы должны привести следующее:
int * = static_cast <int *> (data);
В C ++ 11 у вас есть vector::data
:
cb(a.data());