2012-04-14 6 views
0

Im Erstellen einer Symboltabelle und ich habe eine harte Zeit schreiben get_symbol, die die Argumente von (symbol_table symtab, char sym) hat. Ich muss Code für 2 Funktionen schreiben, get_symbol und set_symbol, ich habe einige Probleme zu verstehen, was eine Symboltabelle ist und wie diese beiden Funktionen geschrieben werden. es besagt, dass get_symbol() zwei Argumente hat: die Symboltabelle und den Symbolnamen, dessen Wert abgerufen werden soll. Wenn der Symbolname einer von A, B, C ist, sollte der entsprechende Wert aus der Symboltabelle zurückgegeben werden. Wenn es keiner dieser Namen ist, sollte 0 zurückgegeben werden. Wenn jemand helfen könnte, wäre das ein großartiger Dank für Ihre Zeit.get_symbol Funktion in C

symbol_table.c Code:

#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

Ich habe aus Ihrer Frage verstanden, was Sie erreichen wollen, aber ich habe nicht verstanden, mit was genau * Sie kämpfen. Um welchen Teil fragst du genau Hilfe? Wenn Sie dies explizit ausführen, werden Sie wahrscheinlich bessere Antworten erhalten. – amit

+0

@amit ich versuche, die beiden Funktionen zu schreiben und weiß nicht, wo ich anfangen soll. – Cka91405

+0

Was ist der Zweck der Aussage 'if (A, B, C)'? Während legal, haben Sie keine der Variablen deklariert, und nur "C" wird tatsächlich als boolescher Ausdruck verwendet. –

Antwort

0

eine Reihe anderer Probleme mit Ihrem Code Es gibt, nicht zuletzt, dass Sie die gesamte Symboltabelle in get_symbol von Wert sind vorbei. Wie viel von dem Code, den Sie zeigen, haben Sie geschrieben, und wie hoch ist der Kode der Kesselplatte, den Sie aussetzen sollten?

Hier ist eine Implementierung einer Symboltabelle, in der die Symbole ein einzelnes Zeichen sind und die Werte nur ints sind, wie bei Ihrem Code. Dies unterstützt jedoch mehr als 3 Symbole.

// 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]; 
} 

Wenn Sie die Funktion Schnittstelle identisch (komplett mit der eher bizarren Definition von symbol_table) halten müssen, dann können Sie nur get_symbol und set_symbol mit einigen einfachen bedingten Anweisungen implementieren: entweder eine Folge von if Aussagen oder eine switch Aussage.

Wenn Sie Schwierigkeiten damit haben, dann lesen Sie die Teile Ihrer Kursmaterialien, die sich mit Zeichentypen und if beschäftigen. Wenn Ihre Kursmaterialien dies nicht abdecken, sollten Sie andere Ressourcen zum Erlernen der C-Sprache finden. versuchen, mit den Einzelteilen ab Great C tutorial? erwähnt

Ja, ich konnte die get_symbol und set_symbol Code für Sie schreiben, aber ich glaube, dass die Hilfe die Sie suchen mehr um herauszufinden, ist, wie mit dem Problem zu beginnen, anstatt eine Einstiegs- ein fertiges Ergebnis ohne Verständnis.

Der Schlüssel, den Sie meiner Meinung nach erreichen müssen, ist ein detailliertes Verständnis darüber, welche spezifischen Aktionen der Computer ausführen muss, um den Wert eines der Symbole zurückzugeben. Beginnen Sie damit, so genau wie möglich in jeder Notation (ein Diagramm oder in Englisch, was auch immer) zu sagen. Versuchen Sie dann, dieses Verständnis in der Sprache C zu implementieren.

Dieser Prozess des ersten Verständnisses des Mechanismus, mit dem Sie das Problem lösen werden - das ist genau das, was Sie den Computer machen wollen - ist völlig zentral für den Prozess des Lernens zu programmieren. Diese Lernerfahrung ist das, was diese Art von Hausaufgaben zu bieten hat, denke ich. Aber niemand kann es für dich tun. Wenn du dir den fertigen Code ansiehst, hilft das vielleicht nicht, denn das "Aha!" Einblick.

Wenn Sie wirklich sind, total, fest, mit dieser Implementierung beginnen:

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; 
} 

Es tut eindeutig die falsche Sache, aber es wird kompilieren. Bearbeiten Sie sie dann, indem Sie sie so ändern, dass ein fester Wert für A, für B und für C zurückgegeben wird. Lesen Sie dann in Ihren Lernmaterialien, wie Sie auf die Mitglieder einer Struktur zugreifen können. Ändern Sie den Code, um immer den Wert des Elements a zurückzugeben.Versuchen Sie dann herauszufinden, wie Sie zwischen den Fällen unterscheiden, in denen der Aufrufer den Wert von A oder B oder C abrufen möchte. Es könnte hilfreich sein, die Member ab und c der Symboltabelle auf einen bestimmten Merkmalswert zu setzen um sicherzustellen, dass Sie die richtige zurückgeben (aber vergessen Sie nicht, diesen Code später zu entfernen).

Sobald Sie das getan haben, beginnen Sie mit der Implementierung von set_symbol. Bis Sie get_symbol Arbeit gemacht haben, sollte set_symbol einfach sein.

+0

Ich versuche, init_symbol_table & destroy_symbol_table so zu halten, wie es geschrieben wurde, und die einzige Struktur, die ich erhielt, war struct symbol_table_s {int a, b, c;} * symbol_table; – Cka91405

+0

Ich habe meine Antwort aktualisiert, um das zu berücksichtigen. –

+0

Vielen Dank! Das ist genau das, was ich versuchte zu bekommen, ich will nicht die richtige Antwort! Vielen Dank ! – Cka91405