error: incompatible type for argument
Solution 1
As Daniel said in his comment and codaddict said in his answer, using &
instead of *
will give you what you want. Here's a bit of an explanation though, to help you remember.
*
de-references what it's attached to, meaning it takes the variable as if it's a pointer and gives the value at that address.
&
passes the reference, meaning it gives the address that the value is stored at, or rather, passes a pointer to the variable.
Since you want to pass a pointer to the variables head and tail, you want to pass them as &head
and &tail
, which gives you the values **head
and **tail
at the other end. It seems counter-intuitive until you get used to it.
Solution 2
add(*head, *tail, n);
should be :
add(&head, &tail, n);
Since you need to pass the address of the head and tail pointers to the function.
Similar fix needs to be made to the call to the show
function.
![kostek](https://i.stack.imgur.com/m0nJj.jpg?s=256&g=1)
Comments
-
kostek almost 4 years
I'm writing a list in C. Below is the source:
#include <stdio.h> #include <stdlib.h> struct list { int value; struct list *next; }; typedef struct list ls; void add (ls **head, ls **tail, int val) { ls *new, *tmp1, *tmp2; if (NULL == *head) { new = (ls*)malloc(sizeof(ls)); *head = new; *tail = new; new->value = val; new->next = NULL; return; } else { tmp1 = *head; tmp2 = tmp1->next; while (tmp2 != NULL) { tmp1 = tmp2; tmp2 = tmp1->next; } new = (ls*)malloc(sizeof(ls)); new->value = val; new->next = NULL; *tail = new; return; } } void show (ls **head, ls **tail) { int i; ls *tmp; while (tmp->next != NULL) { printf("%d: %d", i, tmp->value); i++; tmp=tmp->next; } return; } int main (int argc, char *argv[]) { ls *head; ls *tail; int n, x; head = (ls*)NULL; tail = (ls*)NULL; printf("\n1. add\n2. show\n3. exit\n"); scanf("%d", &x); switch (x) { case 1: scanf("%d", &n); add(*head, *tail, n); break; case 2: show(*head, *tail); break; case 3: return 0; default: break; } return 0; }
When I compile it with gcc
gcc -o lab5.out -Wall -pedantic lab5.c
I get strange errors:
lab5.c: In function ‘main’: lab5.c:84:3: error: incompatible type for argument 1 of ‘add’ lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’ lab5.c:84:3: error: incompatible type for argument 2 of ‘add’ lab5.c:16:6: note: expected ‘struct ls **’ but argument is of type ‘ls’ lab5.c:88:3: error: incompatible type for argument 1 of ‘show’ lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’ lab5.c:88:3: error: incompatible type for argument 2 of ‘show’ lab5.c:52:6: note: expected ‘struct ls **’ but argument is of type ‘ls’
For me everything is OK...
And argument type is
ls**
and notls
as compiler says.Someone see what can be wrong?
PS. I know that it's unnecessary to give
*tail
as argument and it's unused, however it will be, because I want to develop this 'program'...