2012-03-30 9 views
0

Ich habe eine Frage, was bedeutet ein inkompatibler Rückgabetyp Fehler? Ich bekomme immer einen Fehler, der das sagt und ich habe meinen Code mehrmals und nichts geändert. Kann mir bitte jemand helfen und danke.Inkompatibler Rückgabetyp

Im immer den Fehler bei:

circular_list.c: In function ‘circ_list_iterator’: 
circular_list.c:116:(return lst ? NEXT(lst) : NULL;)error: incompatible types in return 
circular_list.c:118:(return (lastreturn == lst) ? NULL : NEXT(lastreturn);)error: incompatible types in return 
circular_list.c:119:(})warning: control reaches end of non-void function 
circular_list.c: In function ‘circ_length’: 
circular_list.c:127:(while((lastreturn = circ_list_iterator(lst, lastreturn)) != NULL))error: incompatible types in assignment 
circular_list.c: In function ‘nth_node’: 
circular_list.c:136:(return NULL;)error: incompatible types in return 
circular_list.c:138:(return lst;)error: incompatible types in return 
circular_list.c:145:(return (number != 0) ? NULL : tmp;)error: incompatible types in return 

circular_list.c

#include <stdio.h> 
#include <stdlib.h> 
#include "globals.h" 
#include "circular_list.h" 

typedef struct node *list_rep; 

typedef struct node { 
    generic_ptr datapointer; 
    list_rep next; 
} node; 


#define DATA(lst) (((list_rep) (lst))->datapointer) 
#define NEXT(lst) (((list_rep) (lst))->next) 

#define TOLIST(list_rep) ((list) (list_rep)) 
#define TOREP(lst)  ((list_rep)(lst)) 

#define TOLISTPTR(list_rep_ptr) ((list *) (list_rep_ptr)) 
#define TOREPPTR(lst_ptr)  ((list_rep *)(lst_ptr)) 

static status allocate_node (list_rep *p_lst, generic_ptr data) 
{ 
    list lst = (list) malloc(sizeof(node)); 

    if (lst == NULL) 
      return ERROR; 

    *p_lst = lst; 
    DATA(lst) = data; 
    NEXT(lst) = NULL; 

    return OK; 
} 

static void free_node (list *p_lst) 
{ 
    free(*p_lst); 
    *p_lst = NULL; 

extern status init_circ_list (list *p_lst) 
{ 
    *p_lst = NULL; 
    return OK; 
} 
extern bool empty_circ_list (list lst) 
{ 
    return (lst == NULL) ? TRUE : FALSE; 
} 

status circ_insert (list *p_lst, generic_ptr data) 
{ 
    list_rep lst, *p_lst_rep = TOREPPTR(p_lst); 

    if (allocate_node(&lst, data) == ERROR) 
      return ERROR; 

    if (empty_circ_list(*p_lst)) { 
      NEXT(lst) = lst; 
      *p_lst_rep = lst; 
    } else { 
      NEXT(lst) = NEXT(*p_lst_rep); 
      NEXT(*p_lst_rep) = lst; 
    } 
    return OK; 
} 

status circ_length  (list lst) 
{ 
    list lastreturn; 
    int length; 

    length = 0; 
    lastreturn = NULL; 
    while((lastreturn = circ_list_iterator(lst, lastreturn)) != NULL) 
      length++; 
    return length; 
} 
status nth_node  (list lst, int number) 
{ 
    list tmp; 

    if (empty_circ_list(lst) == TRUE) 
      return NULL; 
    if (number == -1) 
      return lst; 

    tmp = lst; 
    do { 
      tmp = NEXT(tmp); 
      number--; 
    } while (number > 0 && tmp != lst); 
    return (number != 0) ? NULL : tmp; 

    return 0; 
} 
status circ_traverse (list lst, status  (*p_func_f)()) 
{ 
    list tmp; 

    if (empty_circ_list(lst) == TRUE) 
      return OK; 

    tmp = lst; 
    do { 
      tmp = NEXT(tmp); 
      if ((*p_func_f)(DATA(tmp)) == ERROR) 
        return ERROR; 
    } while (tmp != lst) ; 
return OK; 
} 

circular_list.h

#include "globals.h" 

#ifndef _CIRCULAR_LIST_H 
#define _CIRCULAR_LIST_H 

typedef list lastreturn; 
ABSTRACT_TYPE(list); 

extern status init_circ_list (list *p_lst); 
extern bool empty_circ_list (list lst); 
extern status circ_insert  (list *p_lst, generic_ptr data); 
extern status circ_append  (list *p_lst, generic_ptr data); 
extern status circ_delete  (list *p_lst, generic_ptr *p_data); 
extern status circ_delete_node(list *p_lst, list node); 
extern status circ_list_iterator (list lst, list lastreturn); 
extern status circ_length  (list lst); 
extern status nth_node   (list lst, int number); 
extern status circ_traverse  (list lst, status  (*p_func_f)()); 

extern generic_ptr circ_head(list lst); 
extern list   circ_tail(list lst); 

#endif 

globals.h

#ifndef _GLOBALS_H 
#define _GLOBALS_H 

typedef enum {OK, ERROR} status; 
typedef enum {FALSE = 0, TRUE = 1} bool; 

typedef void *generic_ptr; 

typedef unsigned char byte; 

#define ABSTRACT_TYPE(t)  
typedef void *(t) 

#endif 
+0

in Circ_Length, Sie sollen einen Status zurückgeben, aber Sie geben stattdessen einen int zurück. – Jason

+0

Ich erhalte zahlreiche Kompilierfehler unter gcc, aber nicht diese Nachricht. – Taymon

+0

Das sind die einzigen Fehler, die ich bekomme mit gcc -Wall -g -ansi -pedantische -c circular_list.c, um meinen Code zu kompilieren – Cka91405

Antwort

5

Das sieht falsch:

status nth_node(list lst, int number) 
{ 
    list tmp; 

    ... 

    return (number != 0) ? NULL : tmp; 

    ... 
} 

tmp ist kein status.

+0

Ich weiß nicht, was es ist ? – Cka91405