C언어에서 eval 형태 사용하기..

매그넘의 이미지

제목을.적당하게 달았는지.. 저도 의심스럽습니다. ㅡㅡ; 질문할 내용이

딱히 제목을..뽑기가 어려워서 말이죠...^^

자~ 질문 들어갑니다.!!

C언어에서

int value[] = { 2, 500};
char *str = "$0 * 304 > $1"

저런 형태의 변수가 있습니다.

제가 궁금한것은

str 문자열에서... $0 을 value[0]으로 대치하고 $1 을 value[1]으로 대치한다음에..

식이 참인지 거짓인지 판단하는 방법이..알고 싶습니다.

각 변수를 대입하면

"2 * 304 > 500"

로 되는데.. 위의 문자열을 일반적인 수식으로 생각을 했을때... 참인지 거짓인지 여부를 알아내는 방법이 있을까요?

그리고 이러한 기능도 어떠게 구현을 해야할지.궁금하네요.

char * str = "double($0) > $1";

역시나 $0, $1 에 각각의 값들을 세팅을 하고, int double(int) 이란 함수가 있는상태에서.. double($0) 을 수행한다음에

$1 이랑 비교연산을..해야하는데.. 어떻게 해야할지.. 막막하네요..

고수님들!! 조그마한 힌트 부탁드리겠습니다!!!!

danby04의 이미지

또한 내용도없습니다

lacovnk의 이미지

음. 앞의 일반 식을 평가하는 건 파싱해서 처리하면.. 가능할 것 같습니다.

뒤의 함수 호출도.. double이라는 함수를 미리 등록해두었다면, 함수 포인터로 해결 가능하겠습니다. 만일 미리 등록해두지 않고, 런타임시에 결정되는 문자열이 함수로 존재하는 지는.. 모를 것 같습니다~

위의 두 경우 모두, 문자열을 파싱해서 적절하게 처리해줘야 합니다. 보통 eval이라고 하면, 그 언어의 표현식을 문자열로 받는 경우인데, C에서는 그런 식으로 처리를 할 수 없으니까요. eval이라기보다는, 언어 하나를 짜는 셈이 되겠군요;

danby04의 이미지

네, lacovnk님 말씀대로 보통 다른 말하는 eval이라긴 좀 그렇죠..^^
그래서 방법이 없다구 했던거구요
스트링 리터럴의 부분 내용을 파 내구, 값을 넣구 그래서 expression을 하나 만들어 내구 그 다음에 값을 평가하는(그것도 런타임에)건 유용성도 잘 모르겠구..무엇보다 좀 이상해서요;;

익명사용자의 이미지

스크립트 언어랑 연동해서 런타임중에 스크립트 언어를 불러다쓸수는 없나요?

gamdora의 이미지

간단히 C 인터프리터를 내장하면 되겠네요. (말만 간단하다는······.;;)

winner의 이미지

(^_^)...

winner의 이미지

대충

bool eval(const char *ex, int value[]);
를 원하시는 것 같군요.

사용자정의함수를 적용할 수 있게 하려면
bool eval(const char *ex, int value[], const char *fn[], int f[](int))
정도가 될텐데 아무리 생각해도 이건 좀 over 군요.

segfault의 이미지

C 언어 코드가 미리 기계어로 컴파일되어 실행되는 방식이라는 점을 생각해보면 eval처럼 런타임 중에 임의의 코드를 평가하는 기능은 C 언어의 근본적인 구조상 불가능합니다.
저 상황에서 할 수 있는 가장 간단한 방법은 문자열로 주어진 수식을 해석하여 평가하는 수식 평가기 (evaluator)를 따로 작성하여 내장하는 방식일 듯 합니다.

----
mono* in the swirl

namenu의 이미지

정보 올림피아드에서 저런 문제가 나온 적이 있습니다. 별써 수년 전인데 왠지 정겹군요.

그때 expression을 소스 코드에 박는 프로그램을 만든 다음에 명령행으로 터보씨 컴파일러를 실행하여 결과를 냈습니다.

치명적인 약점은 터보씨가 있어야 한다는 것이죠.. -,.-

암튼, 위엣 분들이 답변하셨듯이 외부 스크립트와 붙이면 간단하겠네요.

댓글 달기

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