【问题标题】:"cannot convert to a pointer type" C [duplicate]“无法转换为指针类型”C [重复]
【发布时间】: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 中,它们的任何一个大小都不应该有空格。是的,编译器不介意。但是阅读您的代码的人通常会介意。
  • 我们在学期开始时收到了一份风格指南,说明我们的代码将如何分级......出于某种原因,它有以这种方式编写的箭头。当我为自己编写代码时,我不使用空格,但我会为课程使用。

标签: c pointers


【解决方案1】:

floatdouble 与整数类型不兼容,您无法将它们转换为指针,您想要的是在堆栈上使用浮点数,或者使用指向浮点数的指针:

float *f = malloc(sizeof *f);
*f = n;
push(stk, f);

要使用堆栈上的元素,请将其转换回来:

float *f = pop(stk);  // I assume your pop function returns a void *
float n = *f;  // n is the number your pushed

【讨论】:

  • 我一定会试一试的,感谢您的回答...我现在的问题是,我如何对堆栈中的内容进行算术运算?在执行任何操作之前,我是否必须将其转换回浮点数?还是我必须尊重它?
  • @GarrettMassey 是的,您只需弹出并取消引用它即可获得原始号码,请参阅我的更新帖子。
  • 这行得通。谢谢你。我不得不改变一些变量,以免与我在其他地方使用的变量发生冲突,但问题已经解决了。非常感谢!
  • 很高兴知道它有效
  • 现在我只需要确保我不会搞砸计算用例...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2021-09-20
  • 2020-08-22
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多