Разыменование пустого указателя на массив указателей - PullRequest
0 голосов
/ 08 марта 2012

Я использую библиотеку потоков, данную мне в школе, и не могу понять, как передать ссылку на массив указателей на метод, или, скорее, у меня возникли проблемы с разыменованием и использованием массива указателей.

Ситуация, которую я (я верю) понимаю:

int main(void)
{
    Foo* bar = new Foo();

    // Passing instance of Foo pointer by reference 
    CThread *myThread = new CThread(MyFunction, ACTIVE, &bar);

    return 0;
}

UINT __stdcall MyFunction(void *arg)
{
    Foo* bar = *(Foo*)(arg); 

    return 0;
}

Я создаю указатель на объект Foo и передаю его по ссылке в поток, выполняющий MyFunction, который принимает указатель void в качестве аргумента. Затем MyFunction приводит «arg» к указателю Foo и отменяет ссылки на него, чтобы получить исходный объект.

Моя проблема возникает, когда я хочу передать массив указателей Foo вместо одного:

int main(void)
{
    Foo* barGroup[3] = 
    {
        new Foo(),
        new Foo(),
        new Foo()
    };

    // Passing instance of Foo pointer by reference 
    CThread *myThread = new CThread(MyFunction, ACTIVE, &barGroup);

    return 0;
}

UINT __stdcall MyFunction(void *arg)
{
    // This is wrong; how do I do this??
    Foo* barGroup[3] = *(Foo[]*)(arg); 

    return 0;
}

1 Ответ

4 голосов
/ 08 марта 2012

Замените MyFunction(&barGroup); на MyFunction(barGroup); (таким образом, передав указатель на первый элемент вместо указателя на весь массив) и используйте вложенный указатель:

Foo** barGroup = (Foo**)(arg); 

Тогда вы можете просто использовать barGroup[0], barGroup[1] и barGroup[2].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...