thread class 컴파일 에러.
글쓴이: theone3 / 작성시간: 월, 2005/11/21 - 2:01오후
아래는 코드입니다.
int CThread::Run(void) { if(pthread_create(&mtid, NULL, &do_it, NULL) != 0) { cout << "pthread_create error" << endl; } return(0); } void* CThread::do_it(void* arg) { while(1) { sleep(1); cout << "....." << endl; } return; }
아래는 에러 메시지 입니다.
"CThread.cc", line 38: Error: Formal argument 3 of type extern "C" void*(*)(void*) in call to pthread_create(unsigned*, const _pthread_attr*, extern "C" void*(*)(void*), void*) is being passed void*(CThread::*)(void*). "CThread.cc", line 52: Error: "CThread::do_it(void*)" is expected to return a value. 2 Error(s) detected.
위와 같은 예제를 C로 짜서 돌리면 잘 실행이 됩니다.
그런데, C++로는 컴파일 에러가 나는데,
어떻게 해야하는지 막막하네요,
도움을 주세요.
Forums:
CThread::do_it()은 void *를 리턴하게 되어 있습니다.
CThread::do_it()은 void *를 리턴하게 되어 있습니다. 위 함수를 보니 그냥 "return;"을 하셨네요.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
아. 두번째 에러는 중요한 게 아닙니다.문제의 핵심은 첫번째 에러를
아. 두번째 에러는 중요한 게 아닙니다.
문제의 핵심은 첫번째 에러를 잡는 겁니다.
당신은 사랑받기 위해 태어난 사람.
한 가지더, member function에 대한 포인터를 직접 void
한 가지더, member function에 대한 포인터를 직접 void *(*)(...)로 캐스팅할 수 없습니다. do_it()을 static member function으로 만드는 등의 작업이 필요합니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
[code:1]int CThread::Run(voi
코드를 이렇게 바꾸고 나서 컴파일을 다시 했습니다.
CC(솔라리스)에서는 에러가 나고 g++은 컴파일이 됩니다.
CC에서의 에러는
입니다. 처음의 에러와 같은 상황인데요,
이 이유를 설명해 주시면 감사하겠습니다.
당신은 사랑받기 위해 태어난 사람.
pthread_create(&mtid, NULL, &do_
pthread_create(&mtid, NULL, &do_it, NULL) 가 아니라
pthread_create(&mtid, NULL, do_it, NULL) 가 되어야 할듯합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
[quote="chadr"]pthread_create(&mtid,
do_it은 function을 가리키게 되는데,
원래 function은 그 주소가 불려지기 때문에,
&가 있건 없건 상관없는 것으로 알고 있습니다.
그리고 &를 빼고 컴파일을 해도 똑같은 에러가 납니다.
답변 감사합니다.
당신은 사랑받기 위해 태어난 사람.
[quote="dongyuri"][code:1]int CThread
제가 하다가 글을 잘 못 올렸습니다.
static을 추가한 곳은 class의 정의가 아니라, 선언부입니다.
위의 코드는 static을 추가하지 않고 클래서 선언에서
static을 추가했습니다.
당신은 사랑받기 위해 태어난 사람.
CThread.h[code:1]#include <pthrea
CThread.h
CThread.cpp
main.cpp
로그인이 풀려 버렸네요.바로 위는 제가 올린 글입니다.
로그인이 풀려 버렸네요.
바로 위는 제가 올린 글입니다.
당신은 사랑받기 위해 태어난 사람.
[code:1]if(pthread_create(&
대신
추가적으로 Thread 클래스를 재사용할 수 있게끔 변경하세요.견
추가적으로 Thread 클래스를 재사용할 수 있게끔 변경하세요.
견본은 Applied C++ 책에 Chapter 5를 참조하시기 바랍니다.
위에 손님들 그리고 답변 해주신 분들 모두 감사합니다.처음에
위에 손님들 그리고 답변 해주신 분들 모두 감사합니다.
처음에 나온 Error는 Warning이 되었습니다. ( CC로 컴파일 할때)
지금 print.google.com에서 Applied C++을 읽어보고 있습니다.
읽어보고 구현하다가 문제가 더 있으면 또 질문 드리겠습니다.
당신은 사랑받기 위해 태어난 사람.
뭐 이것 저것 하다보니, 시간이 많이 흘렀네요 ^^제가 하고 싶은
뭐 이것 저것 하다보니, 시간이 많이 흘렀네요 ^^
제가 하고 싶은 일은 이런 겁니다.
진행하면서 보니, 궁극적으로 제가 하려는 것이 가능한 것인지 의문이 듭니다.
그럼 제가 먼저 설명을 드릴테니, 이것이 가능한지 불가능한지 알려주세요.
위의 코드는 정확한 코드는 아니지만, 대략적인 pseudo코드입니다.
main에서 CThread 클래스를 생성해서, 함수를 run에 인자로 넘겨줍니다.
그러면 CThread 클래스 안에서 run함수가 넘겨받은 함수를 pthread create로
실행합니다.
그리고 CThread::end를 호출해서 이 thread가 종료하도록 기다립니다.
제가 가장 의심스러운 부분은 과연 class에 인자로 함수(혹은 함수 포인터)를
넘길 수 있는가 하는 것입니다. 즉.
이 부분입니다. 물론 그외에도 해결해야할 문제는 많습니다. ㅠㅠ
그럼 많은 분들의 답변을 기다리겠습니다.
또 이런 형태의 프로그램을 짠다면 주의할 점도 지적해 주시면
감사하겠습니다.
당신은 사랑받기 위해 태어난 사람.
댓글 달기