Search code examples
cpointersstructdeclarationtypedef

passing argument 1 of ‘ ’ from incompatible pointer type - C


I'm getting the error passing argument 1 of ‘add_to_polynomial’ from incompatible pointer type but, I'm pretty sure I'm not. But I'm pretty new to C, this is for an assignment.

The Header, polynomial.h

#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H

typedef struct {
  void * data;
  struct poly_t* next;
} poly_t;
void add_to_polynomial(poly_t * poly, const term_t * term);    
#endif

This is inside of a different file - polynomial.c

void add_to_polynomial(poly_t* poly, const term_t* term) 
{
  if(poly->next != NULL)
  { add_to_polynomial(poly->next, term); }
}

I've tried all sorts of stuff, over the past few days but I finally gave up and came here. It's saying that poly->next is an incompatible pointer type... but it's a pointer to another instance of itself, so how is this not working? Which is all the error means right? It thinks that poly->next isn't a poly_t? also how come struct poly_t* is different from poly_t* aren't they the same thing?

First time ever asking a question on here, sorry if I'm not providing enough info or something in advance.


Solution

  • In this typedef definition

    typedef struct {
      void * data;
      struct poly_t* next;
    } poly_t;
    

    you declared an unnamed structure the type of which has the alias poly_t and a named structure struct poly_t in the declaration of the data member

      struct poly_t* next;
    

    Instead write

    typedef struct poly_t {
      void * data;
      struct poly_t* next;
    } poly_t;
    

    Take into account that this function

    void add_to_polynomial(poly_t* poly, const term_t* term) 
    {
      if(poly->next != NULL)
      { add_to_polynomial(poly->next, term); }
    }
    

    does not make sense. All it does is finds a null pointer in the list.

    It seems you mean something like the following

    void add_to_polynomial( poly_t **poly, const term_t *term ) 
    {
        if ( *poly == NULL )
        {
            *poly = malloc( sizeof( poly_t ) );
            ( *poly )->data = term;
            ( *poly )->next = NULL;
        }
        else
        {
            add_to_polynomial( &( *poly )->next, term);
        }
    }