2011-03-10 3 views
2

사용자가 다른 수학 함수처럼 사용할 수있는 C 수학 표현식을 쉽게 만들 수 있도록하는 무료 라이브러리가 있습니까? 나는 '인라인'수학 식처럼 빠르며 프로그램에서 여러 번 사용할 수있는 c 식/함수를 의미합니다. C에서 어떻게 든 할 수 있다고 생각하지만 CUDA dveice 함수 여야 만 진짜인지 알 수있는 사람이 있습니까?사용자가 함수를 생성하는 방법? [ 도서관 ? ]

+0

사용자가이 함수를 어떻게 호출합니까? – Argote

+0

[자동 프로그래밍] (http://en.wikipedia.org/wiki/Automatic_programming)과 같은 것을 의미합니까? – pmg

+0

수학 파서를 원하십니까? –

답변

2

몇 가지 옵션이 있습니다.

void *s = make_func("2 * x + 7"); 
... 
printf("%lf\n", call_func(s, 3.0)); // prints 13 
... 
printf("%lf\n", call_func(s, 5.0)); // prints 17 
... 
free_func(s); 

하나의 옵션은 재귀 적 구조를 유지 함수 포인터와 상수로이를 구현하는 것입니다 : 당신이 사용자가이 같은 여러 번 "전화"할 수있는 무언가를 원하는 가정합니다. 뭔가 같은 : 당신이 이해할 수 있다면

(struct func *){ FUNC, &plus, 
    (struct func *){ FUNC, &times, 
    (struct constant *){ CONST, 2 }, 
    (struct var *){ VAR, 'x' } } 
    (struct constant *){ CONST, 7 } } 

- struct funcenum type_item 트리에서 다음 노드를 가리키는 데 사용됩니다

enum item_type { VAR, CONST, FUNC }; 

struct var { 
    enum item_type; 
    int id; 
}; 

struct constant { 
    enum item_type; 
    double value; 
}; 

struct func { 
    enum item_type; 
    double (*func)(double, double); 
    enum item_type *a, *b; 
}; 

그런 다음 make_func 같은 무언가로 위의 문자열을 구문 분석 (또는 노드의 첫 번째 요소 인 enum)이고 enum은 항목 유형이 무엇인지 알아 내기 위해 코드에서 사용하는 코드입니다. 그러면 call(void *, ...) 함수를 사용할 때 얼마나 많은 변수가 있는지를 계산합니다.이 값은 call 함수가 전달되어야하는 추가 인수의 수입니다. 그런 다음 변수를 우리가 호출 한 값으로 대체 한 다음 계산을 수행합니다.

다른 옵션 (상당히 빠르며 쉽게 확장 할 수 있음)은 libjit과 같은 것을 사용하여 대부분의 작업을 수행합니다. 나는 그것을 사용한 적이 없지만 JIT 컴파일러는 필요에 따라 함께 문자열을 추가 할 수있는 기본 빌딩 블록 (예 : 추가, 곱하기 등의 "지침")을 제공하며 실제 어셈블리 코드로 컴파일합니다 이전에했던 것처럼 함수 포인터를 호출하는 생성 된 구문 트리를 거치지 않아야합니다.) 그래서 호출 할 때 가능한 한 빠르고 동적입니다.

libjit의 API를 잘 모르지만 필요한 것처럼 쉽게 할 수 있습니다. make_funcfree_func은 모두 위의 내용과 거의 같을 수 있습니다 (호출을 call_func으로 변경해야 할 수도 있음). 기본적으로 사용자 문자열을 구문 분석하는 방법에 따라 JIT 객체를 구성, 사용 및 삭제합니다. 위와 동일하지만 실제로는 구문 트리, 데이터 형식 등을 직접 정의 할 필요가 없습니다.

희망이 어느 정도 도움이됩니다.

+1

"상수"를 "문자 그대로"로 변경해야한다고 생각합니다. 오 잘. 나는 실제로 이것을 오늘 밤 나중에 재미있게 구현하려고 할 때 그것을 할 것이다. –

+1

재미와 내 생각이 크게 달라 보이는 것 같습니다. :-디 –

2

libtcc (TCC)은 매우 작고 빠른 JIT로 사용할 수 있습니다. 샘플 사용법은 libtcc_test.cc을 참조하십시오.

관련 문제