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

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

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

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

Q&A

解決済

1回答

1141閲覧

回答例のコードを見比べたときに、なぜ[EMPTY+1]と書かれている理由が分からない

former_neet_cat

総合スコア46

C

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

0グッド

0クリップ

投稿2018/09/18 07:39

前提・実現したいこと

ある入門書の課題に挑戦し、答え合わせをしていたときに理解できない箇所があり、

lang

1const char ELEMENT_SYMBOLS[EMPTY+1] = {'$','~','@','#','&', ' '}; 2 3const char ELEMENT_SYMBOLS[EMPTY+1] = {'$','~','@','#','&', ' '}; 4

この上記のコードの EMPTY + 1  と書かかれている理由がわかりません。
自分がコードを書いたときは、上記のコードの部分は、

lang

1const char ELEMENT_SYMBOLS[] = {'$','~','@','#','&', ' '}; 2 3const char ELEMENT_SYMBOLS[] = {'$','~','@','#','&', ' '};

と、指定せずに書いていました。
なぜ、EMPTY + 1 と書いているのか理解できないので、解説お願いします。

該当のソースコード

lang

1/*=== puzmon2: 敵モンスター関連処理の実装 ===*/ 2/*** インクルード宣言 ***/ 3 4#include <stdio.h> 5 6/*** 列挙型宣言 ***/ 7 8// (a)属性 9typedef enum Element {FIRE, WATER, WIND, EARTH, LIFE, EMPTY} Element; 10 11/*** グローバル定数の宣言 ***/ 12 13// (b)属性別の記号 14const char ELEMENT_SYMBOLS[EMPTY+1] = {'$','~','@','#','&', ' '}; 15 16// (c)属性別のカラーコード(ディスプレイ制御シーケンス用) 17const char ELEMENT_COLORS[EMPTY+1] = {1,6,2,3,5,0}; 18 19/*** 構造体型宣言 ***/ 20 21// (f) モンスター 22typedef struct MONSTER { 23 char* name; 24 Element element; 25 int maxhp; 26 int hp; 27 int attack; 28 int defense; 29} Monster; 30 31// (g)ダンジョン 32typedef struct DUNGEON { 33 Monster* monsters; 34 const int numMonsters; 35} Dungeon; 36 37 38/*** プロトタイプ宣言 ***/ 39 40int goDungeon(char* playerName, Dungeon* pDungeon); 41int doBattle(char* playerName, Monster* pEnemy); 42 43// ユーティリティ関数 44void printMonsterName(Monster* monster); 45 46/*** 関数宣言 ***/ 47 48// (1)ゲーム開始から終了までの流れ 49int main(int argc, char** argv) 50{ 51 if(argc != 2) { 52 printf("エラー: プレイヤー名を指定して起動してください\n"); 53 return 1; 54 } 55 56 printf("*** Puzzle & Monsters ***\n"); 57 58 // ダンジョンの準備 59 Monster dungeonMonsters[] = { 60 {"スライム", WATER, 100, 100, 10, 5}, 61 {"ゴブリン", EARTH, 200, 200, 20, 15}, 62 {"オオコウモリ", WIND, 300, 300, 30, 25}, 63 {"ウェアウルフ", WIND, 400, 400, 40, 30}, 64 {"ドラゴン", FIRE, 800, 800, 50, 40} 65 }; 66 Dungeon dungeon = {dungeonMonsters, 5}; 67 68 // いざ、ダンジョンへ 69 int winCount = goDungeon(argv[1], &dungeon); 70 71 // 冒険終了後 72 if(winCount == dungeon.numMonsters) { 73 printf("***GAME CLEAR!***\n"); 74 } else { 75 printf("***GAME OVER***\n"); 76 } 77 printf("倒したモンスター数=%d\n", winCount); 78 return 0; 79} 80 81// (2)ダンジョン開始から終了までの流れ 82int goDungeon(char* playerName, Dungeon* pDungeon) 83{ 84 printf("%sはダンジョンに到着した\n", playerName); 85 86 // そのダンジョンでバトルを繰り返す 87 int winCount = 0; 88 for(int i = 0; i < pDungeon->numMonsters; i++) { 89 winCount += doBattle(playerName, &(pDungeon->monsters[i])); 90 } 91 92 printf("%sはダンジョンを制覇した!\n", playerName); 93 return winCount; 94} 95 96// (3)バトル開始から終了までの流れ 97int doBattle(char* playerName, Monster* pEnemy) 98{ 99 printMonsterName(pEnemy); 100 printf("が現れた!\n"); 101 102 // ダミーのため速攻倒す 103 printMonsterName(pEnemy); 104 printf("を倒した!\n"); 105 return 1; 106} 107 108/*** ユーティリティ関数宣言 ***/ 109 110// (A)モンスター名のカラー表示 111void printMonsterName(Monster* pMonster) 112{ 113 char symbol = ELEMENT_SYMBOLS[pMonster->element]; 114 115 printf("\x1b[3%dm", ELEMENT_COLORS[pMonster->element]); 116 printf("%c%s%c", symbol, pMonster->name, symbol); 117 printf("\x1b[0m"); 118}

お手柔らかにお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

たんに enum Element の要素数分だけ配列を確保している、というだけかと

投稿2018/09/18 07:43

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問