함수를 실행시켜 주는 함수에 대한 질문입니다.

cococo의 이미지

안녕하십니까. 점심은 맛나게 드셨는지요. 전 이 글 쓰고, 맛나게 먹어 볼 생각입니다만... ㅎㅎㅎ

우선, 제목과 같은 함수를 만들고 싶습니다.
예를 들면, DoExecute( functionName, ... ) 같은 걸 만들어서,
DoExecute안에 함수 이름을 쓰면, 그 함수가 실행되는 거지요.

이걸 어디에 쓸라구 하냐면...
GUI에서, 버튼 클릭을 하면 이벤트가 발생하지 않습니까?
그런데, 이 버튼 자체가 config.txt파일에서 불러 온 설정에 의해 만들어지기 땜에, 이벤트 역시 설정 파일에 의해 결정됩니다. 그래서, DoExecute( FnName, ... ) 라는 식으로 함수를 실행시키는 함수를 만들어서 ClickEvent 안에 넣어보려고 했던 거죠.

첨에는 printf() 처럼 만들면 될 줄 알았는데, struct 를 넘겨주는 게 문제가 되더라구요.
그렇다고 struct 처리 부분을 만들어 주자니, 그럴 거면 아얘 처음부터 인자 자체를 unsigned char *로 넘겨 주고, 각각의 Function에서 type casting 해서 쓰는게 낫지 않을까.. 하는 생각이 들더라구요.

근데, 여기까지 생각해 보니... 과연 어느 방법이 관리가 쉬울까. 하는 생각이 들더란 말입니다.

질문입니다.
1. DoExecute라는, 함수를 실행시키는 함수를 만들되, 실행되는 함수의 형태나 기능이 아직 완전히 정해져 있지 않은 경우, 어떻게 해야 만들 수 있을까요?

2. 만일
2-1.가변 인자를 전달하는 것과,
2-2. 인자를 unsigned char * 로 저장하고, 그 포인터를 함수에 넘겨줘서, 해당 함수가 type casting 하는 방법을 쓸 경우, 어느 쪽이 더 관리에 편할까요?

3. 함수를 실행시키는 함수를 만들려 하는 것 보다, 실행될 함수 자체가 고정되어 있다는 생각 하에 접근하는 것이 올바르고 정신건강상 이로운가요?
현재는 [서비스]만 정해진 상태로, [기능]이 정해져 있지 않거든요.

이상입니다.

추운 날씨 몸 조심하시고, 점심 맛나게 드세요. ^^

cinsk의 이미지

쓸 수 있는 함수 set이 정해져 있고, 특별한 control flow를 제공할 것이 아니라면 단순히 string과 함수 포인터를 매핑하는 테이블만 있으면 될 것 같군요. 예를 들어..

typedef int (*proc_t)(void *);
proc_t find_proc(char *name);

그리고 설정파일에 지정되어 있는 함수 이름을 find_proc()에 주고, 실제 그 함수 포인터를 받아서, 이 것을 호출해 주는 식으로 만들면 될 것 같습니다.

그러나 만약 함수 set이 정해져 있지 않고, 특별한 control flow (예: 루프나 goto, conditional 등)까지 제공해야 한다면, 쓰기 편한 interpreter 하나 찾아서 embedding하는 것이 나을 것 같습니다.

Tcl, guile, 또는 다른 interpreter에 대해 더 검색해 보기 바랍니다.

cococo의 이미지

이래저래 조금 생각해 본 결과...
의외로 간단히 가기로 결정했습니다.
text파일에서 string을 입력하고, 이 string을 숫자로 치환한 다음, HandleEvent() 에서 switch - case 로 구현하기로요.

요구사항이 구체적으로 나오면 그때 바꾸려구요. 요구사항도 안 나왔는데 바꿔봤자 시간만 잡아먹고 그에 비해 결과는 미쁘지 않더라구요.

답변 감사하구요. 좋은 하루 되시기 바랍니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.