gpt4 book ai didi

c - C 中的 get_symbol 函数

转载 作者:行者123 更新时间:2023-11-30 18:00:54 25 4
gpt4 key购买 nike

我正在构建一个符号表,但我很难编写 get_symbol,它的参数为 (symbol_table symtab, char sym)。我必须为两个函数 get_symbol 和 set_symbol 编写代码,我在理解符号表是什么以及如何写出这两个函数时遇到了一些困难。它说 get_symbol() 有两个参数:符号表和应检索其值的符号名称。如果符号名称是 A、B、C 之一,则应返回符号表中的相应值。如果它不是这些名称之一,则应返回 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

最佳答案

您的代码还存在许多其他问题,尤其是您将整个符号表按值传递到 get_symbol 中。您所展示的代码有多少是您自己编写的,有多少样板代码是您应该保留的?

这是符号表的实现,其中符号是单个字符,值只是整数,与您的代码一样。但这支持超过 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];
}
<小时/>

如果您需要保持函数接口(interface)相同(包括相当奇怪的 symbol_table 定义),那么您只需实现 get_symbolset_symbol > 使用一些简单的条件语句:一系列 if 语句或 switch 语句。

如果您对此有困难,请重新阅读类(class) Material 中涉及字符类型和 if 的部分。如果你的类(class) Material 没有涵盖这些,那么你应该寻找一些其他的资源来学习 C 语言;尝试从 Great C tutorial? 中提到的项目开始

是的,我可以为您编写 get_symbolset_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 的固定值来进行处理。然后引用有关如何访问结构成员的学习 Material 。更改代码以始终返回 a 成员的值。然后尝试弄清楚如何区分调用者想要获取 A 或 B 或 C 的值的情况。您可能会发现“人为”设置成员 a b 很有帮助将符号表的 c 更改为某个特征值,以确保返回正确的值(但请记住稍后删除该代码)。

完成此操作后,开始实现 set_symbol。当您使 get_symbol 工作时,set_symbol 应该很容易。

关于c - C 中的 get_symbol 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10158122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com