【问题标题】:Error C2440: 'function' : cannot convert from 'node *' to 'node'错误 C2440:“函数”:无法从“节点 *”转换为“节点”
【发布时间】:2011-11-29 12:22:00
【问题描述】:

当我尝试运行程序时出现此错误:

Error C2440: 'function' : cannot convert from 'node *' to 'node'

当我以 first_node 作为参数调用方法 destroy_node 时,我无法弄清楚我做错了什么。

int dequeue(int *data)
{
    node *first_node;
    int result = 0;

    if(queueref.first != NULL){
        first_node = queueref.first;
        data = (int*) queueref.first->data;

        queueref.first = first_node->next;

        result = destroy_node(first_node);
    }

    return result;
}

static int destroy_node(node *node_ref)
{
    int data = 0;

    free(node_ref);

    if(node_ref == NULL){
        data = 1;
    }

    return data;
}

感谢您的帮助!

编辑:

整个类及其给出错误的代码:result = destroy_node(first_node);

    #include <stdlib.h>
#include <stdio.h>

typedef struct node {
    int data;
    struct node *next;
} node;

typedef struct {
    struct node *first;
    struct node *last;
} queue_c;

static queue_c queueref;

//Funktionsprototyper
#include "queue.h"
static int destroy_node(node node_ref);
static node *create_node(int data);

int enqueue(int data)
{
    node *new_node, *last_node;
    int result = 0;

    new_node = create_node(data);
    if(new_node != NULL){
        if(queueref.first != NULL){
            queueref.first = new_node;
            queueref.last = new_node;
        }
        else{
            queueref.last->next = new_node;
            queueref.last = new_node;
        }

        result = 1;
    }

    return result;
}

static node *create_node(int data)
{
    node *noderef;
    noderef = (node*) malloc(sizeof(node));
    noderef->data = data;
    noderef->next = NULL;

    return noderef;
}

int dequeue(int *data)
{
    node *first_node;
    int result = 0;

    if(queueref.first != NULL){
        first_node = queueref.first;
        data = (int*) queueref.first->data;

        queueref.first = first_node->next;

        result = destroy_node(first_node);
    }

    return result;
}

static int destroy_node(node *node_ref)
{
    free(node_ref);
    return node_ref == NULL;
}

void print_queue()
{
    node *curr_ptr = queueref.first;

    if(curr_ptr != NULL){
        while(curr_ptr != NULL){
            printf("%d -> ", curr_ptr->data);
            curr_ptr = curr_ptr->next;
        }
    }
    else{
        printf("Kön är tom!");
    }
}

int delete_node(int data)
{
    int result = 0;

    node *curr_ptr;
    node *prev_ptr;
    node *temp_ptr;

    if(queueref.first == NULL){
        printf("Kön är tom!");
    }
    else if(queueref.first->data == data){
        temp_ptr = queueref.first;
        queueref.first = queueref.first->next;
        result = destroy_node(temp_ptr);
    }
    else{
        prev_ptr = queueref.first;
        curr_ptr = queueref.first->next;

        while(curr_ptr != NULL){
            if(curr_ptr->data == data){
                result = 1;
                break;
            }

            prev_ptr = curr_ptr;
            curr_ptr = curr_ptr->next;
        }

        if(result){
            temp_ptr = curr_ptr;
            prev_ptr->next = temp_ptr->next;
            result = destroy_node(temp_ptr);
        }
        else{
            printf("Ingen node innehöll talet: %d", data);
        }
    }

    return result;
}

编辑:

在我忘记将原型放在 queue.h 中的地方放松一下,我在执行程序时错过了它。

【问题讨论】:

  • 您很可能没有向我们展示实际代码。
  • 错误真的与destroy_node 调用有关吗?
  • 你能给我们编译器引用的代码行吗?更好的是,发布一个使用错误代码的最小程序,以便我们可以更轻松地帮助您。
  • 你对data = (int*) queueref.first-&gt;data;有什么要求?你的意思是*data = queueref.first-&gt;data;
  • 它的行:“result = destroy_node(first_node);”会产生错误。

标签: c


【解决方案1】:

可能存在冲突的原型;所示代码不应产生此错误。但它也应该至少产生一个警告,因为你正在调用一个未知的函数;将所有destroy_node()之前放在它被调用的地方会更有意义,或者添加一个原型。

请注意,destroy_node() 函数过于复杂。可以改写为:

static int destroy_node(node *node_ref)
{
  free(node_ref);
  return node_ref == NULL;
}

【讨论】:

  • 我在程序的其他部分使用了destroy_node,它仅在dequeue方法中会产生错误。
猜你喜欢
  • 2010-11-24
  • 2012-11-20
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多