2012-04-14 3 views
0

Im (symbol_table symtab, char sym) 인수가있는 get_symbol을 쓰는 데 어려움을 겪고있는 기호 테이블과 메신저를 작성하고 있습니다. 나는 2 개의 함수 get_symbol과 set_symbol에 대한 코드를 작성해야하는데, 나는 심볼 테이블이 무엇인지 이해하고이 두 함수를 작성하는 방법에 문제가있다. get_symbol()에는 두 개의 인수가 있습니다 : 심볼 테이블과 값을 가져와야하는 심볼 이름. 심볼 이름이 A, B, C 중 하나 인 경우 심볼 테이블의 해당 값이 반환되어야합니다. 그 이름이 아닌 경우는 0이 돌려 주어집니다. 당신의 시간 동안 큰 도움을 주실 수 있다면 도와 주실 수 있습니다.C에서 get_symbol 함수

symbol_table.c 번호 :

당신이 get_symbol에 값 전체 심볼 테이블을 전달하는하지 적어도 코드와 다른 많은 문제가있다
#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 

    #include "globals.h" 
    #include "symbol_table.h" 

    typedef struct symbol_table_s { 
      int a,b,c; 
    }*symbol_table_rep; 


    status init_symbol_table (symbol_table *p_symtab) 
    { 
    symbol_table_rep st = malloc(sizeof(struct symbol_table_s)); 
    if (st == NULL) 
      return ERROR; 
    st->a = st->b = st->c = 0; 
    *p_symtab = (symbol_table) st; 
    return OK; 
    } 

    void destroy_symbol_table (symbol_table *p_symtab) 
    { 
    free(*p_symtab); 
    *p_symtab = NULL; 
    } 
    void set_symbol(symbol_table *p_symtab, char sym, int value) 
    { 

    /* WRITE CODE FOR THIS */ 

    } 
    int get_symbol (symbol_table symtab, char sym) 
    { 

    /* WRITE CODE FOR THIS FUNCTION */ 


    symbol_table_rep symtab; 
    if (A,B,C) 
    { 
      return symbol_table; 
    }else{ 
      return 0; 
    } 
    } 

    symbol_table.h Code: 
    #ifndef _SYMBOL_TABLE_H 
    #define _SYMBOL_TABLE_H 

    #include "globals.h" 

    ABSTRACT_TYPE(symbol_table); 

    status init_symbol_table (symbol_table *p_symtab); 
    void destroy_symbol_table(symbol_table *p_symtab); 

    void set_symbol   (symbol_table *p_symtab, char sym, int value); 
    int get_symbol   (symbol_table symtab, char sym); 

    #endif 
+1

나는 당신이 얻으려고하는 것을 당신의 질문에서 이해했으나, 당신이 고투하고있는 것이 무엇인지를 이해하지 못했습니다. 정확히 어떤 부분에 도움을 요청합니까? 명시 적으로 지적하면 더 나은 답변을 얻을 수 있습니다. – amit

+0

@amit 메신저는 두 가지 기능을 작성하려고하지만 어디서부터 시작해야할지 모릅니다. – Cka91405

+0

'if (A, B, C)'문장의 목적은 무엇입니까? 합법적 인 동안, 당신은 어떤 변수도 선언하지 않았고,'C' 만 실제로 불린 표현으로 사용됩니다. –

답변

0

. 얼마나 많은 코드를 작성 했습니까? 보일러 플레이트 코드가 얼마 남지 않았습니까?

다음은 기호와 같이 기호가 단일 문자이고 값이 정수일 경우의 기호 표를 구현 한 것입니다. 그러나 이것은 3 개 이상의 기호를 지원합니다.

// symbol_table.h 
struct symbol_table; 
struct symbol_table* init_symbol_table(void); 
void destroy_symbol_table(struct symbol_table *p_symtab); 

void set_symbol   (symbol_table *p_symtab, char sym, int value); 
int get_symbol   (const symbol_table *symtab, char sym); 

// symbol_table.c 
#include <limits.h> 
#include <stdlib.h> 
#define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0])) 
struct symbol_table 
{ 
    // On rare systems, UCHAR_MAX == SIZE_MAX, and this array size will not work. 
    // Most people will never write code for such a system though. We'll ignore them. 
    int values[UCHAR_MAX+1]; 
}; 

struct symbol_table* init_symbol_table (void) 
{ 
    struct symbol_table *p = malloc(sizeof(struct symbol_table)); 
    if (p) 
    { 
    size_t i; 
    for (i=0; i<ARRAYSIZE(p->values); ++i) 
     p->values[i] = 0; 
    } 
    return p; 
} 


void destroy_symbol_table(struct symbol_table *p) 
{ 
    free(p); 
} 

void set_symbol (symbol_table *p, char sym, int value) 
{ 
    p->values[(unsigned char)sym] = value; 
} 

int get_symbol (const symbol_table *p, char sym) 
{ 
    return p->values[(unsigned char)sym]; 
} 

당신이 (symbol_table의 다소 기괴한 정의와 완료) 동일한 기능 인터페이스를 유지할 필요가 있다면 당신은 단지 몇 가지 간단한 조건문과 get_symbolset_symbol을 구현할 수 있습니다 if 문이나 일련의 중 하나를 switch

어려움이 있으시면 문자 유형 및 if을 다루는 교재의 부분을 다시 읽으십시오. 코스 자료가 그 내용을 다루지 않는다면 C 언어를 배우기위한 다른 자료를 찾아야합니다. 내가 당신을 위해 get_symbolset_symbol 코드를 작성할 수, Great C tutorial?

예에서 언급 된 항목으로 시작하려고하지만 난 당신이 찾고있는 도움은 문제보다는 점점 시작하는 방법을 알아 내는데 더 생각 이해하지 않고 완성 된 결과.

내가해야한다고 생각하는 핵심 사항은 기호 중 하나의 값을 반환하기 위해 컴퓨터가 취해야하는 구체적인 작업을 자세하게 파악하는 것입니다. 가능한 한 정확히 모든 표기법 (다이어그램 또는 영어)으로 시작하는 것으로 시작하십시오. 그런 다음 C 언어로 이해를 구현하십시오.

문제를 해결할 메커니즘을 먼저 이해하는이 프로세스 (즉, 컴퓨터를 구체적으로 만들고자하는 작업)는 프로그래밍 학습 프로세스의 핵심입니다. 그 학습 경험은 이러한 종류의 숙제가 제공하려는 것입니다. 그러나 아무도 당신을 위해 그것을 할 수 없습니다. 완료된 코드를 보여주는 것이 도움이되지 않을 수도 있습니다. 왜냐하면 "Aha!" 통찰력. 그것은 분명히 잘못된 일을

void set_symbol(symbol_table *p_symtab, char sym, int value) 
{ 
    /* WRITE CODE FOR THIS LATER */ 
} 

int get_symbol (symbol_table symtab, char sym) 
{ 
    return 0; 
} 

을하지만, 컴파일 : 당신이 정말로, 완전히 붙어 경우

,이 구현 시작합니다. 그런 다음 을 A, B 및 C에 대해 고정 값으로 수정하여 수정하십시오. 그런 다음 구조 구성원에 액세스하는 방법에 대한 학습 자료를 참조하십시오. 항상 a 구성원의 값을 반환하도록 코드를 변경하십시오.그런 다음 호출자가 A 또는 B 또는 C의 값을 가져 오는 경우를 구별하는 방법을 알아 내려고 시도하십시오. 심볼 테이블의 멤버 abc을 특성적인 값으로 '인공적으로'설정하는 것이 도움이 될 수 있습니다 올바른 코드를 반환하는지 확인하십시오 (단, 나중에 해당 코드를 삭제해야 함).

일단 작업을 완료하면 set_symbol을 구현하는 작업을 시작하십시오. get_symbol을 만들 때까지 set_symbol은 쉬워야합니다.

+0

나는 init_symbol_table 및 destroy_symbol_table을 작성하는 방식으로 유지하려고 시도하고 구조체는 struct_table_s {int a, b, c;} * struct_table; – Cka91405

+0

이를 고려하여 내 대답을 업데이트했습니다. –

+0

정말 고마워요! 이것은 정확히 내가 뭘 하려는지에 대한 정확한 대답을 원하지 않는다! 고맙습니다 ! – Cka91405