質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

2回答

9634閲覧

c言語 リスト構造 コンパイルエラー

tamintya

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2021/05/14 17:20

###リスト構造を用いたプログラミングでのコンパイルエラー

画面から"n"が入力されるまで(名前、点数)を入力し続け、"n"が入力されたら最高点とその名前、最低点と名前を表示するプログラムを作りました。
しかしコンパイル時の警告の処理がわからないため教えて欲しいです。
よろしくおねがいします。

発生している問題・エラーメッセージ

c:19: 警告: implicit declaration of function ‘strcmp’ c:24: 警告: format ‘%d’ expects type ‘int *’, but argument 3 has type ‘int’ c:36: 警告: assignment makes integer from pointer without a cast c:54: 警告: assignment makes pointer from integer without a cast

該当のソースコード

c言語

1#include <stdio.h> 2#include<stdlib.h> 3 struct SCORE_DATA { 4 char name[256]; 5 int score; 6 }; 7typedef struct SCORE_DATA DATA; 8 9int main(void){ 10 int i=1; 11 char yn[100]; 12 DATA *p,*max,*min,*q; 13 DATA *listhead=NULL; 14 DATA *listtail=NULL; 15 //続けるかどうかの確認 16 while(1){ 17 printf("データ入力を続けますか(y/n)→ "); 18 scanf("%s" , yn); 19 if(strcmp(yn,"n")){ 20 //yの場合の動作 21 //データの入力 22 p=(DATA*)malloc(sizeof(DATA)); 23 printf( "%d 人目のスコア: 名前と点数を入力(スペース区切り)→ ", i ); 24 scanf( "%s %d", p->name, p->score ); 25 //1個目のデータの場合 26 if ( listhead == NULL ) { 27 listhead=p; 28 listtail=p; 29 //maxとminに代入しておく 30 max=p; 31 min=p; 32 i++; 33 } 34 //2個目以降のデータの場合 35 else { 36 listtail->score=p; 37 listtail=p; 38 //データの比較と代入 39 if(max->score < p->score) max=p; 40 if(min->score > p->score) min=p; 41} 42 i++; 43//yの時の動作の終わりのかっこ 44} 45 else if (strcmp(yn,"y")){ 46 //nの場合の動作 47break; 48 }; 49 }; 50 //maxやminの表示 51 printf( "最高点:%3d点(%sさん)\n", max->score, max->name); 52 printf( "最低点:%3d点(%sさん)\n", min->score, min->name); 53 while(p != NULL){ 54 q=p->score; 55 free(p); 56 p=q; 57 } 58return 0; 59} 60

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/05/14 17:42

struct SCORE_DATA には next ポインタがないので、リスト構造になってませんよね。(する必要もなさそうですが…。)
tamintya

2021/05/15 01:56

コメントありがとうございます。 確かにリスト構造ではありませんでした。 まだリスト構造を理解しきれていないのでご指摘ありがとうございます。
guest

回答2

0

ベストアンサー

「警告の処理がわからない」という言葉がなにを言っているのでしょう?
・警告になっている処理が、なぜ警告になるのか(プログラムが主体)
・警告を受けて、どうすればいいのか(あなたが主体)

とりあえず前者として
c:19: 警告: implicit declaration of function ‘strcmp’
「strcmpは暗黙の宣言をされています」
C言語では、ソースファイルを上から順に読んでいってプログラムを解釈します。変数やマクロでは、そこまでに出てきていない名前のものがあったら「そんなの知らない」とエラーになりますが、関数の場合は歴史的経緯で「書かれている関数名、引数の型で戻り値int」の関数と仮定してコンパイルを進めます。仮定ですので、実は違った...ということが起こり得ます。プログラマが引数の型を間違えていたり、間違えていなくても例えば関数としては浮動小数点を期待しているところに整数を与えていて、「そういう関数」としてコンパイルされてしまったり。
そういう「事故」を防ぐため、関数プロトタイプというものが導入されました。関数の名前、引数リスト、戻り値の型をあらかじめ「明示的に」コンパイラに教えてやるものです。昨今のプログラミングにおいてはこれが当然と考えられていて、「暗黙の」仮定によるコンパイルは危険物扱いです。
質問のプログラムではstrcmpとは何者かがプログラムに登場しておらず、つまり「暗黙」に頼っているので警告になっています。

c:24: 警告: format ‘%d’ expects type ‘int *’, but argument 3 has type ‘int’
「scanfの書式指定"%d"は、対応する引数にintへのポインタを期待しているのに、実際に与えれらた対応する引数がint型だ」
Cの文法的には可変長引数のものについては型が指定できないのでこれをエラーにするのはコンパイラの権限を超えていてできないけど、おかしいよね? という警告。大抵は間違いでしょう。

c:36: 警告: assignment makes integer from pointer without a cast
c:54: 警告: assignment makes pointer from integer without a cast
「ポインタ型(int型)の値を、キャスト操作なしに(勝手に)int型(ポインタ型)に変換しちゃいますよ」
Cは、変数や関数にみっちりと型を要求するわりに指定のものと型が異なる操作に対して鷹揚です。
36行目はlisttail->score=p;で、=の左辺はint型、右辺はポインタ。54行目はq=p->score;で=の左辺はポインタ、右辺はint型。勝手に型を変換して代入しちゃうぞ、いいんだね? というのが警告の意味。大抵は間違いでしょう。

いずれもCが歴史ある(=原始的な/古い)言語であるがゆえにザルな文法で通っちゃうけど、今どきの言語だったらエラーになっちゃうようなプログラムだよ、と指摘しているものです。文法を変えると過去動いていたプログラムがエラーになるので変えられないけど、新しく設計されたコンパイラならこの辺を検出できるのでエラーには至らずとも「警告」として間違いのタネを教えてくれているものです。

投稿2021/05/14 23:26

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamintya

2021/05/15 01:58

質問の内容が曖昧ですみませんでした。 質問の意図としては後者の方でしたが丁寧な説明のおかげで理解することができました。 ありがとうございました。
guest

0

google翻訳
c:19: 警告: 関数「strcmp」の暗黙の宣言
c:24: 警告: フォーマット「%d」はタイプ「int *」を想定していますが、引数3のタイプは「int」です
c:36: 警告: 代入は、キャストなしでポインタから整数を作成します

1つ目、strcmp関数のプロトタイプ宣言がありません。
ぐぐってみればわかりますが、string.hをインクルードする必要があります

投稿2021/05/14 22:26

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問