Предупреждение: несовместимый тип указателя - PullRequest
0 голосов
/ 17 февраля 2012

Я работал над этой проблемой около недели, я искал множество решений по предупреждению «несовместимый тип указателя», но я все еще не уверен, как можно исправить эту ошибку компиляции.

Iпоявляется сообщение об ошибке:

char_stack_interface.c: In function ‘pop_char’:
char_stack_interface.c:32: warning: passing argument 2 of ‘pop’ from incompatible pointer type
char_stack_interface.c: In function ‘top_char’:
char_stack_interface.c:43: warning: passing argument 2 of ‘top’ from incompatible pointer type

Это мой код:

char_stack_interface.h:

#ifndef _CHAR_STACK_INTERFACE_H
#define _CHAR_STACK_INTERFACE_H

#include "stack.h"

extern status push_char(stack *p_s, char  c);
extern status pop_char (stack *p_s, char *p_c);
extern status top_char (stack *p_s, char *p_c);

#endif

stack.h:

#ifndef _STACK_H
#define _STACK_H

#include "globals.h"

ABSTRACT_TYPE(stack);

extern status init_stack (stack *p_S);
extern bool   empty_stack(stack *p_S);
extern status push       (stack *p_S , generic_ptr data);
extern status pop        (stack *p_S , generic_ptr *p_data);
extern status top        (stack *p_S , generic_ptr *p_data);

#endif

char_stack_interface.c:

#include <stdio.h>
#include <stdlib.h>
#include "char_stack_interface.h"
#include "stack.h"

status push_char(stack *p_s, char c)
{
    char *p_c = NULL;
    p_c = (char *) malloc(sizeof(char));

    if (p_c == NULL)
        return ERROR;

    *p_c = c;

    if (push(p_s, p_c) == ERROR) {
        free(p_c);
        return ERROR;
    }

    return OK;
}
status pop_char (stack *p_s, char *p_c)
{
    char *p_data;

    if (pop(p_s, p_data) == ERROR)
        return ERROR;

    *p_c = *p_data;

    free(p_data);

    return OK;
}
status top_char (stack *p_s, char *p_c)
{
    char *p_data;

    if (top(p_s, &p_data) == ERROR)
        return ERROR;

    *p_c = *p_data;

    return OK;
}

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Предполагается, что generic_ptr (как обычно):

typedef void* generic_ptr;

Тогда pop:

extern status pop        (stack *p_S , void **p_data);

И вы называете это как:

pop(stack*, char*);

Следовательно, вы передаете char* аргумент void**, который относится к недопустимому типу указателя.В зависимости от того, как обрабатывается указатель в pop, вам придется передать указатель на ваш указатель и / или явно указать компилятору, как обрабатывать ситуацию с явным приведением.

2 голосов
/ 17 февраля 2012

Хорошо, независимо от типа generic_ptr, очевидно, что компилятор не может автоматически преобразовать ваш тип 'char *' в общий тип ptr.Попробуйте явно указать второй аргумент для pop и top, например:

pop (p_s, (generic_ptr) p_data)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...