[解決済み] 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
をもう一方の端に置く。慣れるまでは直感に反しているように見えますが。
関連
-
[解決済み】fatal error: Python.h: そのようなファイルやディレクトリはありません
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] 型チェック:typeof、GetType、is?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】pandasでカラムの種類を変更する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言