2012-04-14 14 views
0

シンボルテーブルを作成して、get_symbolを書くのが苦労しています。これには、(symbol_table symtab、char sym)という引数があります。私は2つの関数get_symbolとset_symbolのコードを書かなければなりません。シンボルテーブルの内容とこれら2つの関数の書き方を理解する上で問題があります。 get_symbol()には2つの引数があります:シンボルテーブルと値を取得するシンボル名です。シンボル名がA、B、Cのいずれかである場合、シンボルテーブルの対応する値が返されます。それらの名前の1つではない場合は、0が返されます。もしあなたのお時間を頂きまして、ありがとうございました。Cのget_symbol関数

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は2つの関数を書き出しようとしていて、どこから開始するのか分からない。 – Cka91405

+0

文if(A、B、C)の目的は何ですか?法的には、あなたは変数のどれも宣言しておらず、 'C'だけが実際にブール式として使われます。 –

答えて

0

あなたはget_symbolに値によって全体のシンボルテーブルを渡しているあなたのコードと他の多くの問題ではなく、少なくともがあります。あなたが書いたコードのどれだけを書いたのですか、あなたが残すはずのボイラープレートコードはどれくらいですか?

ここではシンボルが1文字で、値はコードと同様にint型のシンボルテーブルの実装です。しかし、これは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?

に言及したアイテムを起動してみてください理解なしで完成した結果。

私があなたが達成しなければならないと信じる重要なことは、コンピュータが記号の1つの値を返すためにどのような具体的な行動を取る必要があるかを詳細に理解することです。できるだけ正確に、どんな表記でも(図表、英語など)表記することから始めます。次に、その理解を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の値をフェッチする場合を区別する方法を見つけようとします。シンボルテーブルのメンバーabおよびcをある種の特性値正しいものを返すようにします(ただし、後でそのコードを削除することを忘れないでください)。

これを実行したら、set_symbolの実装を開始してください。 get_symbolを作った頃には、set_symbolは簡単です。

+0

私はinit_symbol_tableとdestroy_symbol_tableを書いたままにしておきたいのですが、構造体はstruct_table_s {int a、b、c;} * symbol_table; – Cka91405

+0

私はそれを考慮に入れて私の答えを更新しました。 –

+0

ありがとうございました!これは正確に私が取得しようとしていたものは、私は正しい答えをしたくない!ありがとうございました ! – Cka91405