2012-02-17 13 views
0

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

я получаю высказывание об ошибке:

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; 
} 
+3

Вы должны добавить дополнительную информацию. Лучше вставьте заголовки (или, по крайней мере, основные определения типов оттуда), а также какую строку вы получите предупреждение. – chetan

+0

Я просто понял, как манекен, что я не поместил сообщение об ошибке там, извините, что я только что обновил его :) – Cka91405

+3

@ Cka91405: Как выглядят прототипы 'pop' и' top'? – netcoder

ответ

2

Ну, независимо от типа generic_ptr, очевидно, что компилятор не может автоматически вводить ваш тип «char *» в общий тип ptr. Попробуйте сделать явный случай вашего второго арг поп и сверху, например:

поп (P_S (generic_ptr) p_data)

+0

Я попробую! – Cka91405

+0

это было! о, это было так просто! спасибо soo много – Cka91405

+1

добро пожаловать. – chetan

2

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

typedef void* generic_ptr; 

Тогда pop является:

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

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

pop(stack*, char*); 

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

+0

см. Im confused, потому что я предполагаю скопировать код из моего учебника и поместить его в файл, и он ничего не показывает в книге. что делает меня более смущенным. :( – Cka91405

+0

@ Cka91405: Он ничего не показывает? – netcoder