[완료]C에서 C__함수 호출하기에 대해 물어볼게요~

seacloud의 이미지

안녕하세요~ 다들 새해 복많이 받으세요~

제가

A 라는 class의 a객체를 생성한 후

A class내 getData()라는 함수를 호출하여 c로된 getDataforState()라는 함수를 실행한합니다.

그런데 getDataforState()함수를 호출하면 c코드로된 callback 함수안으로 이벤트가

들어와서 이 이벤트를 받을 것을 확인하고 다시 A class내 printState()라는 함수를 호출하게 되는데

class 내 함수를 호출 하기 위해서

A *aWrapper;

printStateWrapper()
{
aWrapper->printState();
}

위와 같은 식으로 callback함수내에서 printStateWrapper()를 호출하여

A class내의 printState()를 호출하게 되는데

제가 처음에 getData()를 한 A class의 객체와 callback에서 호출한

wrapper함수의 객체가 달라서 문제가 되네요..

이걸 해결할려면 어떤식으로 접근해야 하는지 조언 주시면 감사하겠습니다~

okdongil의 이미지

저도 잘은 모르지만,
A *aWrapper에 해당 a객체의 this pointer가 Maaping되어야 할거 같은데요.
Mapping안하면 printStateWrapper 이 함수에서 Exception 발생할 거 같은데요.

C함수를 호출할 때, aWrapper에 this pointer를 넣어주거나,
C함수 인자로 this pointer를 넘겨 줘서 printStateWrapper에서
해당 인자의 printState 함수를 실행하면 될거 같습니다.

후자가 좀 더 나은 듯 하네요..

혹시 틀리면 죄송해요. 처음 댓글 달아 보네요. ^^

seacloud의 이미지

답변 감사드립니다.

그런데, c++ 코드상에서 생성된 객체 a의 this 포인터를 aWrapper에 넘길려면 어떻게 해야하나요?

잘 감이 안오네여ㅛ.ㅠㅠ

klara의 이미지

콜백함수의 형태에 따라서 다르지만, 일반적으로는 콜백 함수에서 임의의 유저데이터를 넘길수 있도록 되있는 경우가 많습니다.
확인해보시고 그렇다면 유저데이터로 객체의 포인터를 넘겨주면 되겠지요.
그게 되지 않는다면 전역 변수를 이용하여 주고 받는 수밖에 없습니다.

okdongil의 이미지

이렇게 하심 될 거 같아요.
A::getData(...) { getDataforState((void*)this); }
.....

printStateWrapper((void*)arg)
{
(A *)arg->printState();
}

아니면
A::getData(...) { aWrapper = this; }

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.