【发布时间】:2016-05-02 00:52:52
【问题描述】:
我正在使用我编写的通用堆栈库编写后缀计算器。我先说这是家庭作业,我通常不会在线寻求帮助,但是辅导中心/帮助室今天关闭。
我有一个函数“calc”,它从stdin 获取字符输入,对其进行标记,并确定它是一个数字、+、-、* 还是^。标记器可以正常工作,因为我之前在所有情况下都对其进行了测试。
我实现堆栈库时似乎有问题。
这是有问题的代码:
char num[MAX_NUM];
float n;
while (1) {
switch (token = get_tok(num, sizeof(num))) {
case TOK_NUM:
//printf("TOK_NUM: %s (%lf)\n", num, strtod(num, NULL));
n = strtod(num, NULL);
push(stk, (void *)n);
printf("TOK_NUM_STK: %lf\n", (float)peek(stk));
pop(stk);
break;
还有其他 switch 语句可以处理其他字符(+、-、* 和 ^),但我还没有继续讨论它们。
想法是将字符数组num 转换为浮点数。
push 函数是我的堆栈库的一部分。这是它的代码:
struct stack_t {
int count;
struct node_t {
void *data;
struct node_t *next;
} *head;
};
void push(stack stk, void *data) {
struct node_t *tmp = malloc(sizeof(struct node_t));
tmp -> data = data;
tmp -> next = stk -> head;
stk -> head = tmp;
(stk -> count)++;
}
堆栈库按我的预期工作,因为我以前在其他程序中使用过它,所以我不担心。
我的问题是,当我编译我的后缀计算器时,我收到错误“无法转换为指针类型”,它引用了这一行:
push(stk, (void *)n);
我现在要做的就是从stdin 获取用户的输入,将其压入堆栈,从堆栈中读取,然后将其从堆栈中弹出。我不确定为什么我现在会收到此错误,并且我不确定如何解决它。任何帮助或提示让我朝着正确的方向前进将不胜感激。
【问题讨论】:
-
n的类型是什么?您可能必须分配缓冲区以将数据存储在n中,将数据复制到缓冲区并将指针传递给缓冲区,而不是直接传递n。 -
抱歉。我忘了包括那行。此行出现在
while(1)行之前。float n; -
请不要在点 (
.) 或箭头 (->) 运算符周围放置空格。它们确实结合得非常紧密;在正统的 C 中,它们的任何一个大小都不应该有空格。是的,编译器不介意。但是阅读您的代码的人通常会介意。 -
我们在学期开始时收到了一份风格指南,说明我们的代码将如何分级......出于某种原因,它有以这种方式编写的箭头。当我为自己编写代码时,我不使用空格,但我会为课程使用。