"Функция-член должна быть вызвана или ее адрес взят в функции" Ошибка C++

Я пишу программу в C++ который работает с потоками. Когда я пытаюсь создать процесс, я получаю следующую ошибку: Member function must be called or its address taken in function, Вот мой код:

void PCB::createProcess(){
    asm cli
    this->stack = new unsigned[stackSize];

    stack[stackSize-1] = 0x200;             
    stack[stackSize-2] = FP_SEG(wrapper);
    stack[stackSize-3] = FP_OFF(wrapper);
    this->ss = FP_SEG(stack+stackSize-12);
    this->sp = FP_OFF(stack+stackSize-12);

    asm sti
}


void PCB::wrapper(){

    myThread->run();

    myThread->state = TERMINATED;
}

Я получаю ошибку в этих двух строках:

stack[stackSize-2] = FP_SEG(wrapper);
stack[stackSize-3] = FP_OFF(wrapper);

Я перепробовал все. я пытался (&(wrapper)), PCB::wrapper, &PCB::wrapper и ничего не помогает, это просто дает мне больше ошибок. PCB это имя класса.

Если у кого есть идея, пожалуйста, помогите.

1 ответ

FP_SEG а также FP_OFF являются макросами, которые извлекают селектор сегмента и смещение, соответственно, из указателя. Вот как мы манипулировали указателями в DOS и ранних версиях Windows двадцать с лишним лет назад. Если вы не нацелены на какую-то забавную систему, которую вы не упомянули, они совершенно неуместны.

поскольку PCB::wrapper является функцией-членом, указатель на нее является указателем на функцию-член. Это не обычная функция, поэтому компилятор вправе жаловаться на то, что он не имеет смысла из того, что пытается сделать код.

В эти дни многопоточность выполняется с std::thread, Вам не нужно делать эту хакерскую манипуляцию со стеком; просто передайте указатель на член-функцию и this указатель на конструктор для std::thread,

std::thread thr(&PCB::wrapper, this);
Другие вопросы по тегам