C/C++ void포인터, 함수포인터

조회수 1790회

현재 Nachos Project를 하고 있습니다. Semaphore이나 Lock없이 여러 thread가 하나의 특정 data structure을 건드릴 때 나타나는 오류를 확인 하는 프로그램인데요,

void RemoveNItems(TestArgument testArg) {

    for (int i = 0; i < testArg.N; i++){
        int key;
        if (testArg.list->remove(&key) != NULL) {
            cout << "\t\tThread has REMOVED item with key \'" << key << "\'"<< endl;
        }
        else {
            cout << "\t\tThread couldn't remove item. List was Empty." << endl;
        }
    }
}
void InsertNItems(TestArgument testArg) {

    for(int i = 0; i < testArg.N; i++) {
        int key = rand() % 100;
        char* item = new char((rand() % 25) + 65);
        testArg.list->SortedInsert(item, key);
        cout << "\t\tThread has INSERTED item with key \'" << key << "\'" << endl;
    }
}
void TestThreadTask(TestArgument testArg) {
    InsertNItems(testArg);
    RemoveNItems(testArg); 
} 

TestThreadTask가 Thread가 실행하는 Task입니다.

thread.h에서 Fork가

void Fork(VoidFunctionPtr, void*); 로 정의 되어있는데,

VoidFunctionPtrtypdef void (*VoidFunctionPtr)(void*) 로 정의되어있습니다.

typedef struct {
    DLList *list;
    int T;
    int N;
} TestArgument;

인자로 넘겨줄려고 하는 3개의 변수를 담은 structure입니다.

for (int i = 0; i < T; i++) {
    Thread* t = new Thread("SelfTest");
    t->Fork(&TestThreadTask, testArg);
}

이렇게 하니

No matching function call to 'Thread::Fork(void (*)(TestArgument), TestArgument&)'

혹은

no known conversion for argument 2 from 'TestArgument' to 'void*'

등등 타입과 타입변환 등에 관한 오류가 나네요.. 어떻게 해결해야 할지 모르겟네요

인자로 구조체를 사용해서 형변환이 안되나 싶어, 인자를 int로 받는 함수를 만들어서

t->Fork(&func, i); 이런식으로 해도, 인자값 앞에 (void*), (void*)& 등등 해보아도 소용없네요

보이드 포인터, 함수포인터는 처음 사용해보아서 어떤 식으로 해야할 지 잘 모르겠습니다ㅠㅠ

답변 해주시면 감사하겠습니다.!!

..

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)