0

シンボルテーブルを作成していて、(symbol_table symtab、char sym)の引数を持つget_symbolを書くのに苦労しています。get_symbolとset_symbolの2つの関数のコードを作成する必要がありますが、シンボルテーブルとは何か、およびこれら2つの関数を書き出す方法を理解するのに問題があります。get_symbol()には2つの引数があります。シンボルテーブルと、値を取得する必要のあるシンボル名です。シンボル名がA、B、Cのいずれかである場合、シンボルテーブルの対応する値が返されます。それらの名前の1つでない場合は、0が返されます。誰かが助けてくれるなら、それはあなたの時間に大いに感謝するでしょう。

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
4

1 に答える 1

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_symbolifswitch

それが難しい場合は、キャラクターの種類とを扱っているコース資料の部分を読み直してくださいif。コースの資料でそれがカバーされていない場合は、C言語を学習するための他のリソースを見つける必要があります。Great Cチュートリアルで言及されている項目から始めてみてください?

はい、私はあなたのためにget_symbolset_symbolコードを書くことができますが、あなたが探している助けは、理解せずに完成した結果を得るのではなく、問題を始める方法を理解することに関するものだと思います。

達成する必要があると私が信じる重要なことは、シンボルの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の値をフェッチする場合を区別する方法を理解してみてください。メンバーa bcシンボルテーブルを「人為的に」設定して、確実に特定の値にすることが役立つ場合があります。正しいコードを返します(ただし、後でそのコードを削除することを忘れないでください)。

それが済んだら、の実装に取り​​掛かりますset_symbol。あなたがget_symbol仕事をした時までに、set_symbol簡単なはずです。

于 2012-04-14T23:50:01.420 に答える