2013-10-22 5 views
1

C에서 Forth 해석기를 사용하고 있습니다. Forth 사전을 더 잘 구현하는 방법을 결정할 수 없습니다.C에서 함수 포인터 테이블

struct Word { 
    struct Word* next; 
     char* name; 
     int* opcode; 
     // int arg_count; 
} 
struct Dictionary { 
    struct Word words; 
    int size; 
} 

opcode는 코드 시퀀스이다 - 단어 기능한다. 따라서 각 opcode [i]은 일부 기능에 해당합니다. 나는 그것이 어떤 테이블 [opcode < -> 함수 포인터]와 함께 있어야한다고 생각합니다. 그러나 그것을 구현하는 방법?

함수의 크기를 알 수 없습니다. void *을 사용할 수 없습니다 (또는 할 수 있겠습니까?).

어떻게해야합니까?

+0

이것은 전혀 명확하지 않습니다. 함수 포인터에 정수를 매핑하는 테이블은 완벽하게 가능합니다. 여기서 구체적인 문제는 무엇입니까? –

+0

@OliCharlesworth, 함수의 서명이 다릅니다 – greensher

+0

"struct word words;" ("struct Word * words;와는 대조적으로) 일반적으로 좋은 생각이 아닙니다. –

답변

3

이 정의의 일부 변화는 넷째 기존의 구현에 매우 일반적입니다 :

typedef int cell; 
typedef void code_t (struct Word *); 

struct Word 
{ 
    char name[NAME_LENGTH]; 
    struct Word *next; 
    code_t *code; 
    cell body[]; /* Upon instantiation, this could be zero or more items. */ 
}; 

사전은 다음 next 포인터를 통해 링크 된 목록이 될 것입니다. 단어는 struct Word 헤더와 body 데이터를 인터리빙하여 순차적으로 할당됩니다.

단어를 실행하려면 word->code(word);으로 전화하십시오. code이 가리키는 함수는 body으로 무엇을 할 것인지 결정할 수 있습니다. 본문은 데이터 일 수도 있고 "opcode"라고 부를 수도 있습니다. 원시 단어 반면

void docolon (struct Word *word) 
{ 
    /* IP is a variable holding the instruction pointer. */ 
    rpush (IP); /* Push the current instruction pointer to the return stack. */ 
    IP = (struct Word *)word->body; /* Start executing the word body (opcodes). */ 
} 

, 예를 들면 :

콜론 (고화질)은 다음과 같이에서 code 가리키는 것 +은 다음과 같을 것입니다.

void plus (struct Word *word) 
{ 
    cell n1 = pop(); 
    cell n2 = pop(); 
    push (n1 + n2); 
} 
+0

IP = (struct word *) word-> body; – greensher

1

아래의 모든 내용은 가정을 기반으로합니다. 함수 포인터를 선언하고자합니다.

typedef int (*OPCODE)(char *); 

struct Word 
{ 
    struct Word* next; 
    char* name; 
    OPCODE *opcode; 
    // int arg_count; 
}; 

opcode

는 정수를 반환하고 인수로 char *를 취하는 함수에 대한 함수 포인터입니다. 함수 포인터에 대한 간단한 자습서의 좋은 페이지는 Lars Engelfried의 The Function Pointer Tutorials입니다.