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

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

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

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

Q&A

解決済

2回答

12220閲覧

教科書のコードをコンパイルするとwarningがでます。これを消したいのですがどうしたら消えますか

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/03/17 08:37

教科書のコードをコンパイルするとwarningがでます。これを消したいのですがどうしたら消えますか。
英語が苦手なのでよろしくお願いいたします。
warningの意味もできたらお願いいたします。

コード // スタックの実現例 #include <stdio.h> #include <stdlib.h> //--- スタックを実現する構造体 --- typedef struct { int max; // スタックのサイズ int ptr; // スタックポインタ int *stk; // スタック(の先頭へのポインタ) } Stack; //--- スタックを確保・初期化する --- int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { // 配列の確保に失敗 s->max = 0; return (-1); } s->max = max; return (0); } //--- スタックを解放する --- void StackFree(Stack *s) { if (s->stk != NULL) { // スタックが正しく生成されていれば free(s->stk); s->max = s->ptr = 0; } } //--- スタックにデータをプッシュ --- int StackPush(Stack *s, int x) { if (s->ptr >= s->max) // スタックが満杯 return (-1); s->stk[s->ptr++] = x; return (0); } //--- スタックからデータをポップ --- int StackPop(Stack *s, int *x) { if (s->ptr <= 0) // スタックが空 return (-1); *x = s->stk[--s->ptr]; return (0); } //--- スタックからデータをピーク --- int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) // スタックが空 return (-1); *x = s->stk[s->ptr]; return (0); } //--- スタックの大きさを返却 --- int StackSize(const Stack *s) { return (s->max); } //--- スタックに積まれているデータ数を返却 --- int StackNo(const Stack *s) { return (s->ptr); } //--- スタックは空か --- int StackIsEmpty(const Stack *s) { return (s->ptr <= 0); } //--- スタックは満杯か --- int StackIsFull(const Stack *s) { return (s->ptr >= s->max); } //--- スタックを空にする --- void StackClear(Stack *s) { s->ptr = 0; } int main(void) { Stack stk; if (StackAlloc(&stk, 100) == -1) { puts("スタックの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", StackNo(&stk), StackSize(&stk)); printf("(1) プッシュ (2) ポップ (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: printf("データ:"); scanf("%d", &x); if (StackPush(&stk, x) == -1) puts("プッシュできません。"); break; case 2: if (StackPop(&stk, &x) == -1) puts("ポップできません。"); else printf("ポップしたデータは%dです。\n", x); break; } } StackFree(&stk); return (0); } 実行結果 naka@naka ~/meikaicjs/chap10 $ gcc -o list10_1 list10_1.c -Wall list10_1.c: In function 'main': list10_1.c:110:6: warning: this 'if' clause does not guard... [-Wmisleading-indentation] if (StackPush(&stk, x) == -1) ^~ list10_1.c:111:37: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if' puts("プッシュできません。"); break; ^~~~~ list10_1.c:114:6: warning: this 'else' clause does not guard... [-Wmisleading-indentation] else ^~~~ list10_1.c:115:49: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'else' printf("ポップしたデータは%dです。\n", x); break; ^~~~~

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

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

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

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

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

guest

回答2

0

ソースの書き方の軽い警告です。switchの中のbreak;(2箇所)が、一瞬if文の中にあるように見えてまぎらわしい、というような意味かと。

投稿2018/03/17 09:01

emasaka

総合スコア524

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

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

退会済みユーザー

退会済みユーザー

2018/03/17 09:13

ありがとうございます。
guest

0

ベストアンサー

C言語のコードで、いくらセミコロンで区切れるとは言っても、1行に2文を置くことはおすすめできませんmisleadingly indentedのほうは、そちらに対する警告です)。switch内のbreak;を次の行に回しましょう。

this 'if' clause does not guardの方は、「中括弧なしのifが、直後に実行文がない」ことに対する警告です。

投稿2018/03/17 08:56

maisumakun

総合スコア145123

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問