2012-04-14 1 views
0

Im создает таблицу символов, и им трудно записывать get_symbol, в котором есть аргументы (symbol_table symtab, char sym). Мне нужно написать код для двух функций get_symbol и set_symbol, у меня возникли проблемы с пониманием того, что такое таблица символов и как записать эти две функции. он говорит, что get_symbol() имеет два аргумента: таблицу символов и имя символа, значение которого должно быть восстановлено. Если имя символа является одним из A, B, C, то соответствующее значение из таблицы символов должно быть возвращено. если это не одно из этих имен, то 0 должно быть возвращено. Если бы кто-нибудь мог помочь, это было бы большой благодарностью за ваше время.Функция get_symbol в C

symbol_table.c Код:

#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 im пытается записать две функции и не знает, с чего начать. – Cka91405

+0

Какова цель выражения 'if (A, B, C)'? В то время как правовая, вы не объявили какую-либо переменную, и только 'C' фактически будет использоваться в качестве логического выражения. –

ответ

0

Есть целый ряд других проблем, с кодом, не в последнюю очередь, что вы передаете всю таблицу символов по значению в get_symbol. Сколько кода, который вы показываете, вы пишете, и сколько стоит код котельной, который вы должны оставить как есть?

Вот реализация таблицы символов, где символы являются одиночными символами, а значения - просто ints, как и ваш код. Но это поддерживает более 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_symbol и set_symbol с некоторыми простыми условными выражениями: либо последовательностью if заявлений или a switch заявление.

Если у вас возникли трудности с этим, переходите к перечитанию частей ваших материалов курса, которые касаются типов символов и if. Если ваши материалы курса не охватывают это, тогда вы должны найти другие ресурсы для изучения языка C; попробуйте начать с пунктов, упомянутых в Great C tutorial?

Да, я мог бы написать код get_symbol и set_symbol для вас, но я считаю, что помощь вы ищете больше всего выяснить, как начать работу с этой проблемой, а не получение конечный результат без понимания.

Ключевое значение, которое, как я полагаю, необходимо достичь, - получить подробное представление о том, какие конкретные действия необходимо предпринять компьютеру для возврата значения одного из символов. Начните с того, что, как можно точнее, в любой нотации вообще (диаграмма или на английском языке, что угодно). Затем попытайтесь реализовать это понимание на языке C.

Этот процесс первого понимания механизма, с помощью которого вы решите проблему - то есть то, что конкретно вы хотите сделать компьютером, - является центральным для процесса обучения программированию. Думаю, этот опыт обучения - это то, что эта домашняя работа предназначена для обеспечения. Но никто не может сделать это за вас. Показывать, что код, который вы выполнили, может не помочь, потому что он не будет вдавливать вам в голову «Ага!» в поле зрения.

Если вы на самом деле, полностью, застревает, начните с этой реализации:

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. Вам может показаться полезным «искусственно» установить члены ab и c таблицы символов на некоторое значение признака чтобы вы вернули правильный (но не забудьте удалить этот код позже).

Как только вы это сделаете, начните работу по внедрению set_symbol. К тому времени, когда вы сделали get_symbol работы, set_symbol должно быть легко.

+0

Im пытается сохранить init_symbol_table & destroy_symbol_table способ, которым он написан, и единственная структура i была указана как struct symbol_table_s {int a, b, c;} * symbol_table; – Cka91405

+0

Я обновил свой ответ, чтобы принять это во внимание. –

+0

Большое вам спасибо! Это именно то, что я пытался получить, я не хочу, чтобы правильный ответ! Спасибо ! – Cka91405