1. ホーム
  2. c

[解決済み] error: incompatible type for argument

2022-02-13 10:45:34

質問

C言語でリストを書いています。 以下はそのソースです。

#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;
}

gccでコンパイルすると

gcc -o lab5.out -Wall -pedantic lab5.c

変なエラーが出るんだけど。

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’

私にとっては、すべてOKなのですが......。

そして、引数の型は ls** であって ls コンパイラが言うように

何が間違っているのか、誰か教えてください。

PS. を付与する必要がないことは承知しています。 *tail というのも、私はこの「プログラム」を開発したいからです。

どのように解決するのですか?

Daniel がコメントで、codaddict が回答で言っているように & の代わりに * を使えば、あなたの望むものが得られます。しかし、ここで少し説明します。

* -つまり、変数をポインタのように受け取り、そのアドレスの値を返します。

& 参照 つまり、その値が格納されているアドレスというか、変数へのポインタを渡しているのです。

変数 head と tail へのポインタを渡したいので、それぞれを &head&tail という値が得られます。 **head**tail をもう一方の端に置く。慣れるまでは直感に反しているように見えますが。