Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Передача параметров потоку


Автор: 4eJIoBekMoJIekyJIa 30.4.2008, 03:22
Такая проблема, мне нужно передать в поток переменную типа vector<MyStruct> где например MyStruct объявляеться как
Код

struct MyStruct
{
    int val;
}

насколько я знаю в функцию потока нужно передавать переменную тип (void*), что нужно сделать, чтобы, потом внутри этой функции, преобразовать переменную обратно в vector<MyStruct>?

Автор: t_gran 30.4.2008, 04:31
4eJIoBekMoJIekyJIa, а по твоему void * это что такое? smile
Для справки:  void * - указатель на не определённый тип, а значит работать будет с теми данными (такого типа), которые ты передашь. smile

Добавлено через 5 минут и 41 секунду
Кстати http://forum.vingrad.ru/forum/topic-208794/kw-список-void-указатель.html эта проблема как раз и обсуждается. smile

Автор: MAKCim 30.4.2008, 08:56
Цитата(4eJIoBekMoJIekyJIa @  30.4.2008,  03:22 Найти цитируемый пост)
что нужно сделать, чтобы, потом внутри этой функции, преобразовать переменную обратно в vector<MyStruct>?

Код

static void * thread_routine(void * argument) {
    vector<MyStruct> & vec = static_cast<vector<MyStruct>&>(*static_cast<vector<MyStruct>*>(argument));
}

Автор: GrayCardinal 30.4.2008, 09:00
MAKCim, 
А просто (vector<MyStruct> *) 
не прокатит ?

Автор: MAKCim 30.4.2008, 09:30
Цитата(GrayCardinal @  30.4.2008,  09:00 Найти цитируемый пост)
А просто (vector<MyStruct> *) 
не прокатит ? 

тут как бы С++  smile 
оно прокатит, но при использовании С++ лучше использовать конструкции С++
имхо

Автор: GrayCardinal 30.4.2008, 09:34
MAKCim, 
Согласен.
Надо учиться конструкциям Си++ smile smile 

Автор: JackYF 30.4.2008, 12:34
MAKCim, первый из static_cast'ов не нужен smile

Автор: MAKCim 30.4.2008, 13:46
JackYF,
в С++ автоматическое преобразование void* -> T* без предупреждений возможно?
по-моему это только в С 

Автор: 4eJIoBekMoJIekyJIa 30.4.2008, 14:06
MAKCim,
а можно написать без & ?
Код

 vector<MyStruct> vec = static_cast<vector<MyStruct>>(*static_cast<vector<MyStruct>*>(argument));

Автор: JackYF 30.4.2008, 14:36
Цитата(MAKCim @  30.4.2008,  12:46 Найти цитируемый пост)
в С++ автоматическое преобразование void* -> T* без предупреждений возможно?
по-моему это только в С 

Блин. Я имел в виду:

Код

static void * thread_routine(void * argument) {
    vector<MyStruct> & vec = *static_cast<vector<MyStruct>*>(argument);
}

Автор: 4eJIoBekMoJIekyJIa 30.4.2008, 15:27
Слушайте насчет vector, у меня есть программа
Код

int main()
{
    vector<int> vec;
    for(int i = 0; i < num; i++)
        vec.push_back(i);
    cout<<vec.capacity() << endl;
    return 0;
}

если num =2 - выводит 2, если num =3 - выводит 4, если num =4 - выводит 4, если num =5 - выводит 8. 
Он что при нехватке памяти удваивает ее?
И еще, как нибудь можно получить количество элементов списка, или тока самому пересчитывать?

Автор: MAKCim 30.4.2008, 17:25
Цитата(4eJIoBekMoJIekyJIa @  30.4.2008,  15:27 Найти цитируемый пост)
Он что при нехватке памяти удваивает ее?

в общем случае implementation-specific
в данном случае да
Цитата(4eJIoBekMoJIekyJIa @  30.4.2008,  15:27 Найти цитируемый пост)
И еще, как нибудь можно получить количество элементов списка, или тока самому пересчитывать?

vec.size() не катит?

4eJIoBekMoJIekyJIa, 

M
MAKCim
Модератор: Вопросы по С++ задавайте в соседних форумах!


Добавлено через 26 секунд
Цитата(JackYF @  30.4.2008,  14:36 Найти цитируемый пост)
Блин. Я имел в виду:

ну да  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)