• R/O
  • HTTP
  • SSH
  • HTTPS

hengbandosx: コミット

The master and develop branches track hengband.

OS X development happens on the macos-1-6-2, macos-2-2-1, and macos-develop branches.


コミットメタ情報

リビジョン549a7cc999b21a75b9da49ce926b4fbd33184261 (tree)
日時2021-09-20 15:39:13
作者Habu <habu1010+github@gmai...>
コミッターGitHub

ログメッセージ

Merge pull request #1570 from habu1010/feature/refactor-defeat-temporary-cmake-buffer

[Refactor] C_MAKEによる一時的バッファをstd::vectorで置き換える

変更サマリ

差分

--- a/src/action/activation-execution.cpp
+++ b/src/action/activation-execution.cpp
@@ -188,22 +188,17 @@ static bool activate_whistle(player_type *player_ptr, ae_type *ae_ptr)
188188 (void)SpellHex(player_ptr).stop_all_spells();
189189 }
190190
191- MONSTER_IDX pet_ctr;
192- MONSTER_IDX *who;
193- int max_pet = 0;
194- C_MAKE(who, w_ptr->max_m_idx, MONSTER_IDX);
195- for (pet_ctr = player_ptr->current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--)
191+ std::vector<MONSTER_IDX> who;
192+ for (MONSTER_IDX pet_ctr = player_ptr->current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--)
196193 if (is_pet(&player_ptr->current_floor_ptr->m_list[pet_ctr]) && (player_ptr->riding != pet_ctr))
197- who[max_pet++] = pet_ctr;
194+ who.push_back(pet_ctr);
198195
199196 uint16_t dummy_why;
200- ang_sort(player_ptr, who, &dummy_why, max_pet, ang_sort_comp_pet, ang_sort_swap_hook);
201- for (MONSTER_IDX i = 0; i < max_pet; i++) {
202- pet_ctr = who[i];
197+ ang_sort(player_ptr, who.data(), &dummy_why, who.size(), ang_sort_comp_pet, ang_sort_swap_hook);
198+ for (auto pet_ctr : who) {
203199 teleport_monster_to(player_ptr, pet_ctr, player_ptr->y, player_ptr->x, 100, TELEPORT_PASSIVE);
204200 }
205201
206- C_KILL(who, w_ptr->max_m_idx, MONSTER_IDX);
207202 ae_ptr->o_ptr->timeout = 100 + randint1(100);
208203 return true;
209204 }
--- a/src/cmd-action/cmd-pet.cpp
+++ b/src/cmd-action/cmd-pet.cpp
@@ -72,13 +72,9 @@ void do_cmd_pet_dismiss(player_type *player_ptr)
7272 {
7373 monster_type *m_ptr;
7474 bool all_pets = false;
75- MONSTER_IDX pet_ctr;
76- int i;
7775 int Dismissed = 0;
7876
79- MONSTER_IDX *who;
8077 uint16_t dummy_why;
81- int max_pet = 0;
8278 bool cu, cv;
8379
8480 cu = Term->scr->cu;
@@ -87,23 +83,23 @@ void do_cmd_pet_dismiss(player_type *player_ptr)
8783 Term->scr->cv = 1;
8884
8985 /* Allocate the "who" array */
90- C_MAKE(who, w_ptr->max_m_idx, MONSTER_IDX);
86+ std::vector<MONSTER_IDX> who;
9187
9288 /* Process the monsters (backwards) */
93- for (pet_ctr = player_ptr->current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--) {
89+ for (MONSTER_IDX pet_ctr = player_ptr->current_floor_ptr->m_max - 1; pet_ctr >= 1; pet_ctr--) {
9490 if (is_pet(&player_ptr->current_floor_ptr->m_list[pet_ctr]))
95- who[max_pet++] = pet_ctr;
91+ who.push_back(pet_ctr);
9692 }
9793
98- ang_sort(player_ptr, who, &dummy_why, max_pet, ang_sort_comp_pet_dismiss, ang_sort_swap_hook);
94+ ang_sort(player_ptr, who.data(), &dummy_why, who.size(), ang_sort_comp_pet_dismiss, ang_sort_swap_hook);
9995
10096 /* Process the monsters (backwards) */
101- for (i = 0; i < max_pet; i++) {
97+ for (auto i = 0U; i < who.size(); i++) {
10298 bool delete_this;
10399 GAME_TEXT friend_name[MAX_NLEN];
104100 bool kakunin;
105101
106- pet_ctr = who[i];
102+ auto pet_ctr = who[i];
107103 m_ptr = &player_ptr->current_floor_ptr->m_list[pet_ctr];
108104
109105 delete_this = false;
@@ -115,7 +111,7 @@ void do_cmd_pet_dismiss(player_type *player_ptr)
115111 health_track(player_ptr, pet_ctr);
116112 handle_stuff(player_ptr);
117113
118- msg_format(_("%sを放しますか? [Yes/No/Unnamed (%d体)]", "Dismiss %s? [Yes/No/Unnamed (%d remain)]"), friend_name, max_pet - i);
114+ msg_format(_("%sを放しますか? [Yes/No/Unnamed (%d体)]", "Dismiss %s? [Yes/No/Unnamed (%d remain)]"), friend_name, who.size() - i);
119115
120116 if (m_ptr->ml)
121117 move_cursor_relative(m_ptr->fy, m_ptr->fx);
@@ -178,8 +174,6 @@ void do_cmd_pet_dismiss(player_type *player_ptr)
178174 Term->scr->cv = cv;
179175 term_fresh();
180176
181- C_KILL(who, w_ptr->max_m_idx, MONSTER_IDX);
182-
183177 #ifdef JP
184178 msg_format("%d 体のペットを放しました。", Dismissed);
185179 #else
--- a/src/cmd-io/cmd-lore.cpp
+++ b/src/cmd-io/cmd-lore.cpp
@@ -36,9 +36,6 @@
3636 */
3737 void do_cmd_query_symbol(player_type *player_ptr)
3838 {
39- MONRACE_IDX i;
40- int n;
41- MONRACE_IDX r_idx;
4239 char sym, query;
4340 char buf[256];
4441
@@ -51,15 +48,15 @@ void do_cmd_query_symbol(player_type *player_ptr)
5148 bool recall = false;
5249
5350 uint16_t why = 0;
54- MONRACE_IDX *who;
5551
5652 if (!get_com(_("知りたい文字を入力して下さい(記号 or ^A全,^Uユ,^N非ユ,^R乗馬,^M名前): ",
5753 "Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): "),
5854 &sym, false))
5955 return;
6056
61- for (i = 0; ident_info[i]; ++i) {
62- if (sym == ident_info[i][0])
57+ int ident_i;
58+ for (ident_i = 0; ident_info[ident_i]; ++ident_i) {
59+ if (sym == ident_info[ident_i][0])
6360 break;
6461 }
6562
@@ -82,15 +79,14 @@ void do_cmd_query_symbol(player_type *player_ptr)
8279 return;
8380 }
8481 sprintf(buf, _("名前:%sにマッチ", "Monsters' names with \"%s\""), temp);
85- } else if (ident_info[i]) {
86- sprintf(buf, "%c - %s.", sym, ident_info[i] + 2);
82+ } else if (ident_info[ident_i]) {
83+ sprintf(buf, "%c - %s.", sym, ident_info[ident_i] + 2);
8784 } else {
8885 sprintf(buf, "%c - %s", sym, _("無効な文字", "Unknown Symbol"));
8986 }
9087
9188 prt(buf, 0, 0);
92- C_MAKE(who, max_r_idx, MONRACE_IDX);
93- n = 0;
89+ std::vector<MONRACE_IDX> who;
9490 for (const auto &r_ref : r_info) {
9591 if (!cheat_know && !r_ref.r_sights)
9692 continue;
@@ -133,15 +129,14 @@ void do_cmd_query_symbol(player_type *player_ptr)
133129 #else
134130 if (angband_strstr(temp2, temp))
135131 #endif
136- who[n++] = i;
132+ who.push_back(r_ref.idx);
137133 }
138134
139135 else if (all || (r_ref.d_char == sym))
140- who[n++] = i;
136+ who.push_back(r_ref.idx);
141137 }
142138
143- if (!n) {
144- C_KILL(who, max_r_idx, MONRACE_IDX);
139+ if (who.empty()) {
145140 return;
146141 }
147142
@@ -149,24 +144,23 @@ void do_cmd_query_symbol(player_type *player_ptr)
149144 query = inkey();
150145 prt(buf, 0, 0);
151146 why = 2;
152- ang_sort(player_ptr, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
147+ ang_sort(player_ptr, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
153148 if (query == 'k') {
154149 why = 4;
155150 query = 'y';
156151 }
157152
158153 if (query != 'y') {
159- C_KILL(who, max_r_idx, MONRACE_IDX);
160154 return;
161155 }
162156
163157 if (why == 4) {
164- ang_sort(player_ptr, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
158+ ang_sort(player_ptr, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
165159 }
166160
167- i = n - 1;
161+ auto i = who.size() - 1;
168162 while (true) {
169- r_idx = who[i];
163+ auto r_idx = who[i];
170164 monster_race_track(player_ptr, r_idx);
171165 handle_stuff(player_ptr);
172166 while (true) {
@@ -191,20 +185,19 @@ void do_cmd_query_symbol(player_type *player_ptr)
191185 break;
192186
193187 if (query == '-') {
194- if (++i == n) {
188+ if (++i == who.size()) {
195189 i = 0;
196190 if (!expand_list)
197191 break;
198192 }
199193 } else {
200194 if (i-- == 0) {
201- i = n - 1;
195+ i = who.size() - 1;
202196 if (!expand_list)
203197 break;
204198 }
205199 }
206200 }
207201
208- C_KILL(who, max_r_idx, MONRACE_IDX);
209202 prt(buf, 0, 0);
210203 }
--- a/src/dungeon/dungeon.cpp
+++ b/src/dungeon/dungeon.cpp
@@ -32,8 +32,6 @@ DEPTH *max_dlv;
3232 DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x)
3333 {
3434 DUNGEON_IDX select_dungeon;
35- int num = 0;
36- DUNGEON_IDX *dun;
3735
3836 /* Hack -- No need to choose dungeon in some case */
3937 if (lite_town || vanilla_town || ironman_downward) {
@@ -46,8 +44,7 @@ DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x)
4644 }
4745 }
4846
49- /* Allocate the "dun" array */
50- C_MAKE(dun, w_ptr->max_d_idx, DUNGEON_IDX);
47+ std::vector<DUNGEON_IDX> dun;
5148
5249 screen_save();
5350 for (const auto &d_ref : d_info) {
@@ -65,26 +62,23 @@ DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x)
6562 seiha = true;
6663
6764 sprintf(buf, _(" %c) %c%-12s : 最大 %d 階", " %c) %c%-16s : Max level %d"),
68- 'a' + num, seiha ? '!' : ' ', d_ref.name.c_str(), (int)max_dlv[d_ref.idx]);
69- prt(buf, y + num, x);
70- dun[num++] = d_ref.idx;
65+ static_cast<char>('a' + dun.size()), seiha ? '!' : ' ', d_ref.name.c_str(), (int)max_dlv[d_ref.idx]);
66+ prt(buf, y + dun.size(), x);
67+ dun.push_back(d_ref.idx);
7168 }
7269
73- if (!num) {
70+ if (dun.empty()) {
7471 prt(_(" 選べるダンジョンがない。", " No dungeon is available."), y, x);
7572 }
7673
7774 prt(format(_("どのダンジョン%sしますか:", "Which dungeon do you %s?: "), note), 0, 0);
7875 while (true) {
7976 auto i = inkey();
80- if ((i == ESCAPE) || !num) {
81- /* Free the "dun" array */
82- C_KILL(dun, w_ptr->max_d_idx, DUNGEON_IDX);
83-
77+ if ((i == ESCAPE) || dun.empty()) {
8478 screen_load();
8579 return 0;
8680 }
87- if (i >= 'a' && i < ('a' + num)) {
81+ if (i >= 'a' && i < static_cast<char>('a' + dun.size())) {
8882 select_dungeon = dun[i - 'a'];
8983 break;
9084 } else
@@ -92,9 +86,6 @@ DUNGEON_IDX choose_dungeon(concptr note, POSITION y, POSITION x)
9286 }
9387 screen_load();
9488
95- /* Free the "dun" array */
96- C_KILL(dun, w_ptr->max_d_idx, DUNGEON_IDX);
97-
9889 return select_dungeon;
9990 }
10091
--- a/src/flavor/object-flavor.cpp
+++ b/src/flavor/object-flavor.cpp
@@ -191,9 +191,7 @@ void get_table_sindarin(char *out_string)
191191 */
192192 static void shuffle_flavors(tval_type tval)
193193 {
194- KIND_OBJECT_IDX *k_idx_list;
195- KIND_OBJECT_IDX k_idx_list_num = 0;
196- C_MAKE(k_idx_list, max_k_idx, KIND_OBJECT_IDX);
194+ std::vector<KIND_OBJECT_IDX> k_idx_list;
197195 for (const auto &k_ref : k_info) {
198196 if (k_ref.tval != tval)
199197 continue;
@@ -204,19 +202,14 @@ static void shuffle_flavors(tval_type tval)
204202 if (k_ref.flags.has(TR_FIXED_FLAVOR))
205203 continue;
206204
207- k_idx_list[k_idx_list_num] = k_ref.idx;
208- k_idx_list_num++;
205+ k_idx_list.push_back(k_ref.idx);
209206 }
210207
211- for (KIND_OBJECT_IDX i = 0; i < k_idx_list_num; i++) {
212- object_kind *k1_ptr = &k_info[k_idx_list[i]];
213- object_kind *k2_ptr = &k_info[k_idx_list[randint0(k_idx_list_num)]];
214- int16_t tmp = k1_ptr->flavor;
215- k1_ptr->flavor = k2_ptr->flavor;
216- k2_ptr->flavor = tmp;
208+ for (auto k_idx : k_idx_list) {
209+ object_kind *k1_ptr = &k_info[k_idx];
210+ object_kind *k2_ptr = &k_info[k_idx_list[randint0(k_idx_list.size())]];
211+ std::swap(k1_ptr->flavor, k2_ptr->flavor);
217212 }
218-
219- C_KILL(k_idx_list, max_k_idx, int16_t);
220213 }
221214
222215 /*!
--- a/src/io-dump/character-dump.cpp
+++ b/src/io-dump/character-dump.cpp
@@ -47,6 +47,8 @@
4747 #include "view/display-messages.h"
4848 #include "world/world.h"
4949
50+#include <numeric>
51+
5052 /*!
5153 * @brief プレイヤーのペット情報をファイルにダンプする
5254 * @param player_ptr プレイヤーへの参照ポインタ
@@ -110,21 +112,17 @@ static void dump_aux_pet(player_type *player_ptr, FILE *fff)
110112 static void dump_aux_quest(player_type *player_ptr, FILE *fff)
111113 {
112114 fprintf(fff, _("\n\n [クエスト情報]\n", "\n\n [Quest Information]\n"));
113- QUEST_IDX *quest_num;
114- C_MAKE(quest_num, max_q_idx, QUEST_IDX);
115+ std::vector<QUEST_IDX> quest_num(max_q_idx);
115116
116- for (QUEST_IDX i = 1; i < max_q_idx; i++)
117- quest_num[i] = i;
117+ std::iota(quest_num.begin(), quest_num.end(), static_cast<QUEST_IDX>(0));
118118 int dummy;
119- ang_sort(player_ptr, quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num);
119+ ang_sort(player_ptr, quest_num.data(), &dummy, quest_num.size(), ang_sort_comp_quest_num, ang_sort_swap_quest_num);
120120
121121 fputc('\n', fff);
122- do_cmd_knowledge_quests_completed(player_ptr, fff, quest_num);
122+ do_cmd_knowledge_quests_completed(player_ptr, fff, quest_num.data());
123123 fputc('\n', fff);
124- do_cmd_knowledge_quests_failed(player_ptr, fff, quest_num);
124+ do_cmd_knowledge_quests_failed(player_ptr, fff, quest_num.data());
125125 fputc('\n', fff);
126-
127- C_KILL(quest_num, max_q_idx, QUEST_IDX);
128126 }
129127
130128 /*!
@@ -288,12 +286,10 @@ static void dump_aux_monsters(player_type *player_ptr, FILE *fff)
288286 fprintf(fff, _("\n [倒したモンスター]\n\n", "\n [Defeated Monsters]\n\n"));
289287
290288 /* Allocate the "who" array */
291- MONRACE_IDX *who;
292289 uint16_t why = 2;
293- C_MAKE(who, max_r_idx, MONRACE_IDX);
290+ std::vector<MONRACE_IDX> who;
294291
295292 /* Count monster kills */
296- long uniq_total = 0;
297293 long norm_total = 0;
298294 for (const auto &r_ref : r_info) {
299295 /* Ignore unused index */
@@ -306,7 +302,7 @@ static void dump_aux_monsters(player_type *player_ptr, FILE *fff)
306302 norm_total++;
307303
308304 /* Add a unique monster to the list */
309- who[uniq_total++] = r_ref.idx;
305+ who.push_back(r_ref.idx);
310306 }
311307
312308 continue;
@@ -320,10 +316,10 @@ static void dump_aux_monsters(player_type *player_ptr, FILE *fff)
320316 /* No monsters is defeated */
321317 if (norm_total < 1) {
322318 fprintf(fff, _("まだ敵を倒していません。\n", "You have defeated no enemies yet.\n"));
323- C_KILL(who, max_r_idx, int16_t);
324319 return;
325320 }
326321
322+ const long uniq_total = who.size();
327323 /* Defeated more than one normal monsters */
328324 if (uniq_total == 0) {
329325 #ifdef JP
@@ -331,7 +327,6 @@ static void dump_aux_monsters(player_type *player_ptr, FILE *fff)
331327 #else
332328 fprintf(fff, "You have defeated %ld %s.\n", norm_total, norm_total == 1 ? "enemy" : "enemies");
333329 #endif
334- C_KILL(who, max_r_idx, int16_t);
335330 return;
336331 }
337332
@@ -344,12 +339,12 @@ static void dump_aux_monsters(player_type *player_ptr, FILE *fff)
344339 #endif
345340
346341 /* Sort the array by dungeon depth of monsters */
347- ang_sort(player_ptr, who, &why, uniq_total, ang_sort_comp_hook, ang_sort_swap_hook);
342+ ang_sort(player_ptr, who.data(), &why, uniq_total, ang_sort_comp_hook, ang_sort_swap_hook);
348343 fprintf(fff, _("\n《上位%ld体のユニーク・モンスター》\n", "\n< Unique monsters top %ld >\n"), MIN(uniq_total, 10));
349344
350345 char buf[80];
351- for (MONRACE_IDX k = uniq_total - 1; k >= 0 && k >= uniq_total - 10; k--) {
352- monster_race *r_ptr = &r_info[who[k]];
346+ for (auto it = who.rbegin(); it != who.rend() && std::distance(who.rbegin(), it) < 10; it++) {
347+ monster_race *r_ptr = &r_info[*it];
353348 if (r_ptr->defeat_level && r_ptr->defeat_time)
354349 sprintf(buf, _(" - レベル%2d - %d:%02d:%02d", " - level %2d - %d:%02d:%02d"), r_ptr->defeat_level, r_ptr->defeat_time / (60 * 60),
355350 (r_ptr->defeat_time / 60) % 60, r_ptr->defeat_time % 60);
@@ -358,8 +353,6 @@ static void dump_aux_monsters(player_type *player_ptr, FILE *fff)
358353
359354 fprintf(fff, _(" %-40s (レベル%3d)%s\n", " %-40s (level %3d)%s\n"), r_ptr->name.c_str(), (int)r_ptr->level, buf);
360355 }
361-
362- C_KILL(who, max_r_idx, int16_t);
363356 }
364357
365358 /*!
--- a/src/knowledge/knowledge-features.cpp
+++ b/src/knowledge/knowledge-features.cpp
@@ -102,8 +102,7 @@ void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f
102102 TERM_LEN wid, hgt;
103103 term_get_size(&wid, &hgt);
104104
105- FEAT_IDX *feat_idx;
106- C_MAKE(feat_idx, max_f_idx, FEAT_IDX);
105+ std::vector<FEAT_IDX> feat_idx(f_info.size());
107106
108107 concptr feature_group_text[] = { "terrains", nullptr };
109108 int len;
@@ -121,7 +120,7 @@ void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f
121120 if (len > max)
122121 max = len;
123122
124- if (collect_features(feat_idx, 0x01)) {
123+ if (collect_features(feat_idx.data(), 0x01)) {
125124 grp_idx[grp_cnt++] = i;
126125 }
127126 }
@@ -198,7 +197,7 @@ void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f
198197 display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
199198 if (old_grp_cur != grp_cur) {
200199 old_grp_cur = grp_cur;
201- feat_cnt = collect_features(feat_idx, 0x00);
200+ feat_cnt = collect_features(feat_idx.data(), 0x00);
202201 }
203202
204203 while (feat_cur < feat_top)
@@ -208,10 +207,10 @@ void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f
208207 }
209208
210209 if (!visual_list) {
211- display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
210+ display_feature_list(max + 3, 6, browser_rows, feat_idx.data(), feat_cur, feat_top, visual_only, F_LIT_STANDARD);
212211 } else {
213212 feat_top = feat_cur;
214- display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
213+ display_feature_list(max + 3, 6, 1, feat_idx.data(), feat_cur, feat_top, visual_only, *lighting_level);
215214 display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left);
216215 }
217216
@@ -334,8 +333,6 @@ void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f
334333 }
335334 }
336335 }
337-
338- C_KILL(feat_idx, max_f_idx, FEAT_IDX);
339336 }
340337
341338 /*
--- a/src/knowledge/knowledge-items.cpp
+++ b/src/knowledge/knowledge-items.cpp
@@ -46,10 +46,8 @@ void do_cmd_knowledge_artifacts(player_type *player_ptr)
4646 if (!open_temporary_file(&fff, file_name))
4747 return;
4848
49- ARTIFACT_IDX *who;
50- C_MAKE(who, max_a_idx, ARTIFACT_IDX);
51- bool *okay;
52- C_MAKE(okay, max_a_idx, bool);
49+ //! @note 一般的に std::vector<bool> は使用を避けるべきとされているが、ここの用途では問題ない
50+ std::vector<bool> okay(a_info.size());
5351
5452 for (const auto &a_ref : a_info) {
5553 okay[a_ref.idx] = false;
@@ -89,16 +87,16 @@ void do_cmd_knowledge_artifacts(player_type *player_ptr)
8987 okay[o_ptr->name1] = false;
9088 }
9189
92- int n = 0;
90+ std::vector<ARTIFACT_IDX> whats;
9391 for (const auto &a_ref : a_info) {
9492 if (okay[a_ref.idx])
95- who[n++] = a_ref.idx;
93+ whats.push_back(a_ref.idx);
9694 }
9795
9896 uint16_t why = 3;
99- ang_sort(player_ptr, who, &why, n, ang_sort_art_comp, ang_sort_art_swap);
100- for (ARTIFACT_IDX k = 0; k < n; k++) {
101- artifact_type *a_ptr = &a_info[who[k]];
97+ ang_sort(player_ptr, whats.data(), &why, whats.size(), ang_sort_art_comp, ang_sort_art_swap);
98+ for (auto a_idx : whats) {
99+ artifact_type *a_ptr = &a_info[a_idx];
102100 GAME_TEXT base_name[MAX_NLEN];
103101 strcpy(base_name, _("未知の伝説のアイテム", "Unknown Artifact"));
104102 ARTIFACT_IDX z = lookup_kind(a_ptr->tval, a_ptr->sval);
@@ -107,7 +105,7 @@ void do_cmd_knowledge_artifacts(player_type *player_ptr)
107105 object_type *q_ptr;
108106 q_ptr = &forge;
109107 q_ptr->prep(z);
110- q_ptr->name1 = who[k];
108+ q_ptr->name1 = a_idx;
111109 q_ptr->ident |= IDENT_STORE;
112110 describe_flavor(player_ptr, base_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
113111 }
@@ -115,8 +113,6 @@ void do_cmd_knowledge_artifacts(player_type *player_ptr)
115113 fprintf(fff, _(" %s\n", " The %s\n"), base_name);
116114 }
117115
118- C_KILL(who, max_a_idx, ARTIFACT_IDX);
119- C_KILL(okay, max_a_idx, bool);
120116 angband_fclose(fff);
121117 (void)show_file(player_ptr, true, file_name, _("既知の伝説のアイテム", "Artifacts Seen"), 0, 0);
122118 fd_kill(file_name);
@@ -245,7 +241,6 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v
245241 KIND_OBJECT_IDX object_old, object_top;
246242 KIND_OBJECT_IDX grp_idx[100];
247243 int object_cnt;
248- OBJECT_IDX *object_idx;
249244
250245 bool visual_list = false;
251246 TERM_COLOR attr_top = 0;
@@ -256,7 +251,7 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v
256251 term_get_size(&wid, &hgt);
257252
258253 int browser_rows = hgt - 8;
259- C_MAKE(object_idx, max_k_idx, KIND_OBJECT_IDX);
254+ std::vector<KIND_OBJECT_IDX> object_idx(k_info.size());
260255
261256 int len;
262257 int max = 0;
@@ -268,7 +263,7 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v
268263 if (len > max)
269264 max = len;
270265
271- if (collect_objects(i, object_idx, mode)) {
266+ if (collect_objects(i, object_idx.data(), mode)) {
272267 grp_idx[grp_cnt++] = i;
273268 }
274269 }
@@ -348,7 +343,7 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v
348343 display_group_list(0, 6, max, browser_rows, grp_idx, object_group_text, grp_cur, grp_top);
349344 if (old_grp_cur != grp_cur) {
350345 old_grp_cur = grp_cur;
351- object_cnt = collect_objects(grp_idx[grp_cur], object_idx, mode);
346+ object_cnt = collect_objects(grp_idx[grp_cur], object_idx.data(), mode);
352347 }
353348
354349 while (object_cur < object_top)
@@ -358,10 +353,10 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v
358353 }
359354
360355 if (!visual_list) {
361- display_object_list(max + 3, 6, browser_rows, object_idx, object_cur, object_top, visual_only);
356+ display_object_list(max + 3, 6, browser_rows, object_idx.data(), object_cur, object_top, visual_only);
362357 } else {
363358 object_top = object_cur;
364- display_object_list(max + 3, 6, 1, object_idx, object_cur, object_top, visual_only);
359+ display_object_list(max + 3, 6, 1, object_idx.data(), object_cur, object_top, visual_only);
365360 display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left);
366361 }
367362
@@ -438,6 +433,4 @@ void do_cmd_knowledge_objects(player_type *player_ptr, bool *need_redraw, bool v
438433 }
439434 }
440435 }
441-
442- C_KILL(object_idx, max_k_idx, KIND_OBJECT_IDX);
443436 }
--- a/src/knowledge/knowledge-monsters.cpp
+++ b/src/knowledge/knowledge-monsters.cpp
@@ -289,8 +289,7 @@ void do_cmd_knowledge_monsters(player_type *player_ptr, bool *need_redraw, bool
289289 {
290290 TERM_LEN wid, hgt;
291291 term_get_size(&wid, &hgt);
292- IDX *mon_idx;
293- C_MAKE(mon_idx, max_r_idx, MONRACE_IDX);
292+ std::vector<MONRACE_IDX> mon_idx(r_info.size());
294293
295294 int max = 0;
296295 IDX grp_cnt = 0;
@@ -309,7 +308,7 @@ void do_cmd_knowledge_monsters(player_type *player_ptr, bool *need_redraw, bool
309308 if (len > max)
310309 max = len;
311310
312- if ((monster_group_char[i] == ((char *)-1L)) || collect_monsters(player_ptr, i, mon_idx, mode)) {
311+ if ((monster_group_char[i] == ((char *)-1L)) || collect_monsters(player_ptr, i, mon_idx.data(), mode)) {
313312 grp_idx[grp_cnt++] = i;
314313 }
315314 }
@@ -369,7 +368,7 @@ void do_cmd_knowledge_monsters(player_type *player_ptr, bool *need_redraw, bool
369368 display_group_list(0, 6, max, browser_rows, grp_idx, monster_group_text, grp_cur, grp_top);
370369 if (old_grp_cur != grp_cur) {
371370 old_grp_cur = grp_cur;
372- mon_cnt = collect_monsters(player_ptr, grp_idx[grp_cur], mon_idx, mode);
371+ mon_cnt = collect_monsters(player_ptr, grp_idx[grp_cur], mon_idx.data(), mode);
373372 }
374373
375374 while (mon_cur < mon_top)
@@ -379,10 +378,10 @@ void do_cmd_knowledge_monsters(player_type *player_ptr, bool *need_redraw, bool
379378 }
380379
381380 if (!visual_list) {
382- display_monster_list(max + 3, 6, browser_rows, mon_idx, mon_cur, mon_top, visual_only);
381+ display_monster_list(max + 3, 6, browser_rows, mon_idx.data(), mon_cur, mon_top, visual_only);
383382 } else {
384383 mon_top = mon_cur;
385- display_monster_list(max + 3, 6, 1, mon_idx, mon_cur, mon_top, visual_only);
384+ display_monster_list(max + 3, 6, 1, mon_idx.data(), mon_cur, mon_top, visual_only);
386385 display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left);
387386 }
388387
@@ -456,8 +455,6 @@ void do_cmd_knowledge_monsters(player_type *player_ptr, bool *need_redraw, bool
456455 }
457456 }
458457 }
459-
460- C_KILL(mon_idx, max_r_idx, MONRACE_IDX);
461458 }
462459
463460 /*
--- a/src/knowledge/knowledge-quests.cpp
+++ b/src/knowledge/knowledge-quests.cpp
@@ -25,6 +25,8 @@
2525 #include "util/sort.h"
2626 #include "world/world.h"
2727
28+#include <numeric>
29+
2830 /*!
2931 * @brief Check on the status of an active quest
3032 * @param player_ptr プレイヤーへの参照ポインタ
@@ -292,20 +294,17 @@ void do_cmd_knowledge_quests(player_type *player_ptr)
292294 if (!open_temporary_file(&fff, file_name))
293295 return;
294296
295- IDX *quest_num;
296- C_MAKE(quest_num, max_q_idx, QUEST_IDX);
297-
298- for (IDX i = 1; i < max_q_idx; i++)
299- quest_num[i] = i;
297+ std::vector<QUEST_IDX> quest_num(max_q_idx);
298+ std::iota(quest_num.begin(), quest_num.end(), static_cast<QUEST_IDX>(0));
300299
301300 int dummy;
302- ang_sort(player_ptr, quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num);
301+ ang_sort(player_ptr, quest_num.data(), &dummy, quest_num.size(), ang_sort_comp_quest_num, ang_sort_swap_quest_num);
303302
304303 do_cmd_knowledge_quests_current(player_ptr, fff);
305304 fputc('\n', fff);
306- do_cmd_knowledge_quests_completed(player_ptr, fff, quest_num);
305+ do_cmd_knowledge_quests_completed(player_ptr, fff, quest_num.data());
307306 fputc('\n', fff);
308- do_cmd_knowledge_quests_failed(player_ptr, fff, quest_num);
307+ do_cmd_knowledge_quests_failed(player_ptr, fff, quest_num.data());
309308 if (w_ptr->wizard) {
310309 fputc('\n', fff);
311310 do_cmd_knowledge_quests_wiz_random(fff);
@@ -314,5 +313,4 @@ void do_cmd_knowledge_quests(player_type *player_ptr)
314313 angband_fclose(fff);
315314 (void)show_file(player_ptr, true, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
316315 fd_kill(file_name);
317- C_KILL(quest_num, max_q_idx, QUEST_IDX);
318316 }
--- a/src/knowledge/knowledge-uniques.cpp
+++ b/src/knowledge/knowledge-uniques.cpp
@@ -18,13 +18,12 @@
1818 typedef struct unique_list_type {
1919 bool is_alive;
2020 uint16_t why;
21- IDX *who;
21+ std::vector<MONRACE_IDX> who;
2222 int num_uniques[10];
2323 int num_uniques_surface;
2424 int num_uniques_over100;
2525 int num_uniques_total;
2626 int max_lev;
27- int n;
2827 } unique_list_type;
2928
3029 unique_list_type *initialize_unique_lsit_type(unique_list_type *unique_list_ptr, bool is_alive)
@@ -35,7 +34,6 @@ unique_list_type *initialize_unique_lsit_type(unique_list_type *unique_list_ptr,
3534 unique_list_ptr->num_uniques_over100 = 0;
3635 unique_list_ptr->num_uniques_total = 0;
3736 unique_list_ptr->max_lev = -1;
38- unique_list_ptr->n = 0;
3937 for (IDX i = 0; i < 10; i++)
4038 unique_list_ptr->num_uniques[i] = 0;
4139
@@ -111,8 +109,8 @@ static void display_uniques(unique_list_type *unique_list_ptr, FILE *fff)
111109 }
112110
113111 char buf[80];
114- for (int k = 0; k < unique_list_ptr->n; k++) {
115- monster_race *r_ptr = &r_info[unique_list_ptr->who[k]];
112+ for (auto r_idx : unique_list_ptr->who) {
113+ monster_race *r_ptr = &r_info[r_idx];
116114
117115 if (r_ptr->defeat_level && r_ptr->defeat_time)
118116 sprintf(buf, _(" - レベル%2d - %d:%02d:%02d", " - level %2d - %d:%02d:%02d"), r_ptr->defeat_level, r_ptr->defeat_time / (60 * 60),
@@ -138,7 +136,6 @@ void do_cmd_knowledge_uniques(player_type *player_ptr, bool is_alive)
138136 if (!open_temporary_file(&fff, file_name))
139137 return;
140138
141- C_MAKE(unique_list_ptr->who, max_r_idx, MONRACE_IDX);
142139 for (auto &r_ref : r_info) {
143140 if (r_ref.idx == 0) {
144141 continue;
@@ -157,12 +154,11 @@ void do_cmd_knowledge_uniques(player_type *player_ptr, bool is_alive)
157154 } else
158155 unique_list_ptr->num_uniques_surface++;
159156
160- unique_list_ptr->who[unique_list_ptr->n++] = r_ref.idx;
157+ unique_list_ptr->who.push_back(r_ref.idx);
161158 }
162159
163- ang_sort(player_ptr, unique_list_ptr->who, &unique_list_ptr->why, unique_list_ptr->n, ang_sort_comp_hook, ang_sort_swap_hook);
160+ ang_sort(player_ptr, unique_list_ptr->who.data(), &unique_list_ptr->why, unique_list_ptr->who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
164161 display_uniques(unique_list_ptr, fff);
165- C_KILL(unique_list_ptr->who, max_r_idx, int16_t);
166162 angband_fclose(fff);
167163 concptr title_desc
168164 = unique_list_ptr->is_alive ? _("まだ生きているユニーク・モンスター", "Alive Uniques") : _("もう撃破したユニーク・モンスター", "Dead Uniques");
--- a/src/load/floor-loader.cpp
+++ b/src/load/floor-loader.cpp
@@ -44,7 +44,6 @@
4444 */
4545 errr rd_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
4646 {
47- grid_template_type *templates;
4847 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4948 clear_cave(player_ptr);
5049 player_ptr->x = player_ptr->y = 0;
@@ -111,24 +110,23 @@ errr rd_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
111110
112111 uint16_t limit;
113112 rd_u16b(&limit);
114- C_MAKE(templates, limit, grid_template_type);
113+ std::vector<grid_template_type> templates(limit);
115114
116- for (int i = 0; i < limit; i++) {
117- grid_template_type *ct_ptr = &templates[i];
115+ for (auto &ct_ref : templates) {
118116 rd_u16b(&tmp16u);
119- ct_ptr->info = (BIT_FLAGS)tmp16u;
117+ ct_ref.info = (BIT_FLAGS)tmp16u;
120118 if (h_older_than(1, 7, 0, 2)) {
121119 byte tmp8u;
122120 rd_byte(&tmp8u);
123- ct_ptr->feat = (int16_t)tmp8u;
121+ ct_ref.feat = (int16_t)tmp8u;
124122 rd_byte(&tmp8u);
125- ct_ptr->mimic = (int16_t)tmp8u;
123+ ct_ref.mimic = (int16_t)tmp8u;
126124 } else {
127- rd_s16b(&ct_ptr->feat);
128- rd_s16b(&ct_ptr->mimic);
125+ rd_s16b(&ct_ref.feat);
126+ rd_s16b(&ct_ref.mimic);
129127 }
130128
131- rd_s16b(&ct_ptr->special);
129+ rd_s16b(&ct_ref.special);
132130 }
133131
134132 POSITION ymax = floor_ptr->height;
@@ -180,7 +178,6 @@ errr rd_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
180178 }
181179 }
182180
183- C_KILL(templates, limit, grid_template_type);
184181 rd_u16b(&limit);
185182 if (limit > w_ptr->max_o_idx)
186183 return 151;
--- a/src/load/load.cpp
+++ b/src/load/load.cpp
@@ -240,12 +240,10 @@ static errr exe_reading_savefile(player_type *player_ptr)
240240 rd_u16b(&player_ptr->pet_extra_flags);
241241
242242 if (!h_older_than(1, 0, 9)) {
243- char *buf;
244- C_MAKE(buf, SCREEN_BUF_MAX_SIZE, char);
245- rd_string(buf, SCREEN_BUF_MAX_SIZE);
243+ std::vector<char> buf(SCREEN_BUF_MAX_SIZE);
244+ rd_string(buf.data(), SCREEN_BUF_MAX_SIZE);
246245 if (buf[0])
247- screen_dump = string_make(buf);
248- C_KILL(buf, SCREEN_BUF_MAX_SIZE, char);
246+ screen_dump = string_make(buf.data());
249247 }
250248
251249 errr restore_dungeon_result = restore_dungeon(player_ptr);
--- a/src/locale/japanese.cpp
+++ b/src/locale/japanese.cpp
@@ -164,11 +164,10 @@ void sjis2euc(char *str)
164164 {
165165 int i;
166166 unsigned char c1, c2;
167- unsigned char *tmp;
168167
169168 int len = strlen(str);
170169
171- C_MAKE(tmp, len + 1, byte);
170+ std::vector<char> tmp(len + 1);
172171
173172 for (i = 0; i < len; i++) {
174173 c1 = str[i];
@@ -188,9 +187,7 @@ void sjis2euc(char *str)
188187 tmp[i] = c1;
189188 }
190189 tmp[len] = 0;
191- strcpy(str, (char *)tmp);
192-
193- C_KILL(tmp, len + 1, byte);
190+ strcpy(str, tmp.data());
194191 }
195192
196193 /*!
@@ -202,11 +199,10 @@ void euc2sjis(char *str)
202199 {
203200 int i;
204201 unsigned char c1, c2;
205- unsigned char *tmp;
206202
207203 int len = strlen(str);
208204
209- C_MAKE(tmp, len + 1, byte);
205+ std::vector<char> tmp(len + 1);
210206
211207 for (i = 0; i < len; i++) {
212208 c1 = str[i];
@@ -227,9 +223,7 @@ void euc2sjis(char *str)
227223 tmp[i] = c1;
228224 }
229225 tmp[len] = 0;
230- strcpy(str, (char *)tmp);
231-
232- C_KILL(tmp, len + 1, byte);
226+ strcpy(str, tmp.data());
233227 }
234228
235229 /*!
@@ -481,24 +475,20 @@ static bool utf8_to_sys(char *utf8_str, char *sys_str_buffer, size_t sys_str_buf
481475
482476 #elif defined(SJIS) && defined(WINDOWS)
483477
484- LPWSTR utf16buf;
485478 int input_len = strlen(utf8_str) + 1; /* include termination character */
486479
487- C_MAKE(utf16buf, input_len, WCHAR);
480+ std::vector<WCHAR> utf16buf(input_len);
488481
489482 /* UTF-8 -> UTF-16 */
490- if (MultiByteToWideChar(CP_UTF8, 0, utf8_str, input_len, utf16buf, input_len) == 0) {
491- C_KILL(utf16buf, input_len, WCHAR);
483+ if (MultiByteToWideChar(CP_UTF8, 0, utf8_str, input_len, utf16buf.data(), input_len) == 0) {
492484 return false;
493485 }
494486
495487 /* UTF-8 -> SJIS(CP932) */
496- if (WideCharToMultiByte(932, 0, utf16buf, -1, sys_str_buffer, sys_str_buflen, nullptr, nullptr) == 0) {
497- C_KILL(utf16buf, input_len, WCHAR);
488+ if (WideCharToMultiByte(932, 0, utf16buf.data(), -1, sys_str_buffer, sys_str_buflen, nullptr, nullptr) == 0) {
498489 return false;
499490 }
500491
501- C_KILL(utf16buf, input_len, WCHAR);
502492 return true;
503493
504494 #endif
@@ -517,14 +507,12 @@ void guess_convert_to_system_encoding(char *strbuf, int buflen)
517507 return;
518508
519509 if (is_utf8_str(strbuf)) {
520- char *work;
521- C_MAKE(work, buflen, char);
522- angband_strcpy(work, strbuf, buflen);
523- if (!utf8_to_sys(work, strbuf, buflen)) {
510+ std::vector<char> work(buflen);
511+ angband_strcpy(work.data(), strbuf, buflen);
512+ if (!utf8_to_sys(work.data(), strbuf, buflen)) {
524513 msg_print("警告:文字コードの変換に失敗しました");
525514 msg_print(nullptr);
526515 }
527- C_KILL(work, buflen, char);
528516 }
529517 }
530518
--- a/src/main/game-data-initializer.cpp
+++ b/src/main/game-data-initializer.cpp
@@ -159,9 +159,7 @@ errr init_object_alloc(void)
159159 */
160160 errr init_alloc(void)
161161 {
162- monster_race *r_ptr;
163- tag_type *elements;
164- C_MAKE(elements, max_r_idx, tag_type);
162+ std::vector<tag_type> elements(r_info.size());
165163 for (const auto &r_ref : r_info) {
166164 if (r_ref.idx > 0) {
167165 elements[r_ref.idx].tag = r_ref.level;
@@ -169,11 +167,11 @@ errr init_alloc(void)
169167 }
170168 }
171169
172- tag_sort(elements, max_r_idx);
170+ tag_sort(elements.data(), elements.size());
173171 alloc_race_size = max_r_idx;
174172 C_MAKE(alloc_race_table, alloc_race_size, alloc_entry);
175173 for (int i = 1; i < max_r_idx; i++) {
176- r_ptr = &r_info[elements[i].index];
174+ auto r_ptr = &r_info[elements[i].index];
177175 if (r_ptr->rarity == 0)
178176 continue;
179177
@@ -185,7 +183,6 @@ errr init_alloc(void)
185183 alloc_race_table[i].prob2 = (PROB)p;
186184 }
187185
188- C_KILL(elements, max_r_idx, tag_type);
189186 (void)init_object_alloc();
190187 return 0;
191188 }
--- a/src/market/building-monster.cpp
+++ b/src/market/building-monster.cpp
@@ -28,15 +28,12 @@ bool research_mon(player_type *player_ptr)
2828 bool notpicked;
2929 bool recall = false;
3030 uint16_t why = 0;
31- MONSTER_IDX *who;
3231
3332 bool all = false;
3433 bool uniq = false;
3534 bool norm = false;
3635 char temp[MAX_MONSTER_NAME] = "";
3736
38- static int old_sym = '\0';
39- static IDX old_i = 0;
4037 screen_save();
4138
4239 char sym;
@@ -49,9 +46,9 @@ bool research_mon(player_type *player_ptr)
4946 return false;
5047 }
5148
52- IDX i;
53- for (i = 0; ident_info[i]; ++i) {
54- if (sym == ident_info[i][0])
49+ IDX ident_i;
50+ for (ident_i = 0; ident_info[ident_i]; ++ident_i) {
51+ if (sym == ident_info[ident_i][0])
5552 break;
5653 }
5754
@@ -75,8 +72,8 @@ bool research_mon(player_type *player_ptr)
7572 }
7673
7774 sprintf(buf, _("名前:%sにマッチ", "Monsters' names with \"%s\""), temp);
78- } else if (ident_info[i]) {
79- sprintf(buf, "%c - %s.", sym, ident_info[i] + 2);
75+ } else if (ident_info[ident_i]) {
76+ sprintf(buf, "%c - %s.", sym, ident_info[ident_i] + 2);
8077 } else {
8178 sprintf(buf, "%c - %s", sym, _("無効な文字", "Unknown Symbol"));
8279 }
@@ -85,10 +82,9 @@ bool research_mon(player_type *player_ptr)
8582 prt(buf, 16, 10);
8683
8784 /* Allocate the "who" array */
88- C_MAKE(who, max_r_idx, MONRACE_IDX);
85+ std::vector<MONRACE_IDX> who;
8986
9087 /* Collect matching monsters */
91- int n = 0;
9288 for (const auto &r_ref : r_info) {
9389 /* Empty monster */
9490 if (r_ref.idx == 0 || r_ref.name.empty())
@@ -132,14 +128,13 @@ bool research_mon(player_type *player_ptr)
132128 #else
133129 if (angband_strstr(temp2, temp))
134130 #endif
135- who[n++] = i;
131+ who.push_back(r_ref.idx);
136132 } else if (all || (r_ref.d_char == sym)) {
137- who[n++] = i;
133+ who.push_back(r_ref.idx);
138134 }
139135 }
140136
141- if (n == 0) {
142- C_KILL(who, max_r_idx, MONRACE_IDX);
137+ if (who.empty()) {
143138 screen_load();
144139
145140 return false;
@@ -149,18 +144,20 @@ bool research_mon(player_type *player_ptr)
149144 char query = 'y';
150145
151146 if (why) {
152- ang_sort(player_ptr, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
147+ ang_sort(player_ptr, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
153148 }
154149
155- if (old_sym == sym && old_i < n)
150+ uint i;
151+ static int old_sym = '\0';
152+ static uint old_i = 0;
153+ if (old_sym == sym && old_i < who.size())
156154 i = old_i;
157155 else
158- i = n - 1;
156+ i = who.size() - 1;
159157
160158 notpicked = true;
161- MONRACE_IDX r_idx;
162159 while (notpicked) {
163- r_idx = who[i];
160+ auto r_idx = who[i];
164161 roff_top(r_idx);
165162 term_addstr(-1, TERM_WHITE, _(" ['r'思い出, ' 'で続行, ESC]", " [(r)ecall, ESC, space to continue]"));
166163 while (true) {
@@ -185,7 +182,7 @@ bool research_mon(player_type *player_ptr)
185182 break;
186183
187184 if (query == '-') {
188- if (++i == n) {
185+ if (++i == who.size()) {
189186 i = 0;
190187 if (!expand_list)
191188 break;
@@ -195,13 +192,12 @@ bool research_mon(player_type *player_ptr)
195192 }
196193
197194 if (i-- == 0) {
198- i = n - 1;
195+ i = who.size() - 1;
199196 if (!expand_list)
200197 break;
201198 }
202199 }
203200
204- C_KILL(who, max_r_idx, MONRACE_IDX);
205201 screen_load();
206202 return !notpicked;
207203 }
--- a/src/room/rooms-city.cpp
+++ b/src/room/rooms-city.cpp
@@ -15,23 +15,18 @@
1515
1616 #include <algorithm>
1717
18-static ugbldg_type *ugbldg;
19-
2018 /*
2119 * Precalculate buildings' location of underground arcade
2220 */
23-static bool precalc_ugarcade(int town_hgt, int town_wid, int n)
21+static bool precalc_ugarcade(int town_hgt, int town_wid, int n, std::vector<ugbldg_type>& ugbldg)
2422 {
2523 POSITION i, y, x, center_y, center_x;
2624 int tmp, attempt = 10000;
2725 POSITION max_bldg_hgt = 3 * town_hgt / MAX_TOWN_HGT;
2826 POSITION max_bldg_wid = 5 * town_wid / MAX_TOWN_WID;
2927 ugbldg_type *cur_ugbldg;
30- bool **ugarcade_used, abort;
31- C_MAKE(ugarcade_used, town_hgt, bool *);
32- C_MAKE(*ugarcade_used, town_hgt * town_wid, bool);
33- for (y = 1; y < town_hgt; y++)
34- ugarcade_used[y] = *ugarcade_used + y * town_wid;
28+ std::vector<std::vector<bool>> ugarcade_used(town_hgt, std::vector<bool>(town_wid));
29+ bool abort;
3530
3631 for (i = 0; i < n; i++) {
3732 cur_ugbldg = &ugbldg[i];
@@ -69,8 +64,6 @@ static bool precalc_ugarcade(int town_hgt, int town_wid, int n)
6964 }
7065 }
7166
72- C_KILL(*ugarcade_used, town_hgt * town_wid, bool);
73- C_KILL(ugarcade_used, town_hgt, bool *);
7467 return i == n;
7568 }
7669
@@ -106,11 +99,11 @@ static void generate_fill_perm_bold(player_type *player_ptr, POSITION y1, POSITI
10699 * @note
107100 * Note: ltcy and ltcx indicate "left top corner".
108101 */
109-static void build_stores(player_type *player_ptr, POSITION ltcy, POSITION ltcx, int stores[], int n)
102+static void build_stores(player_type *player_ptr, POSITION ltcy, POSITION ltcx, int stores[], int n, const std::vector<ugbldg_type>& ugbldg)
110103 {
111104 int i;
112105 POSITION y, x;
113- ugbldg_type *cur_ugbldg;
106+ const ugbldg_type *cur_ugbldg;
114107
115108 for (i = 0; i < n; i++) {
116109 cur_ugbldg = &ugbldg[i];
@@ -192,22 +185,19 @@ bool build_type16(player_type *player_ptr, dun_data_type *dd_ptr)
192185 if (!n)
193186 return false;
194187
195- C_MAKE(ugbldg, n, ugbldg_type);
196- if (!precalc_ugarcade(town_hgt, town_wid, n)) {
197- C_KILL(ugbldg, n, ugbldg_type);
188+ std::vector<ugbldg_type> ugbldg(n);
189+ if (!precalc_ugarcade(town_hgt, town_wid, n, ugbldg)) {
198190 return false;
199191 }
200192
201193 if (!find_space(player_ptr, dd_ptr, &yval, &xval, town_hgt + 4, town_wid + 4)) {
202- C_KILL(ugbldg, n, ugbldg_type);
203194 return false;
204195 }
205196
206197 y1 = yval - (town_hgt / 2);
207198 x1 = xval - (town_wid / 2);
208199 generate_room_floor(player_ptr, y1 + town_hgt / 3, x1 + town_wid / 3, y1 + town_hgt * 2 / 3, x1 + town_wid * 2 / 3, false);
209- build_stores(player_ptr, y1, x1, stores, n);
200+ build_stores(player_ptr, y1, x1, stores, n, ugbldg);
210201 msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("地下街を生成しました", "Underground arcade was generated."));
211- C_KILL(ugbldg, n, ugbldg_type);
212202 return true;
213203 }
--- a/src/room/rooms-maze-vault.cpp
+++ b/src/room/rooms-maze-vault.cpp
@@ -130,11 +130,8 @@ void build_maze_vault(player_type *player_ptr, POSITION x0, POSITION y0, POSITIO
130130 int n = dy + 1;
131131 int num_vertices = m * n;
132132
133- int *visited;
134- C_MAKE(visited, num_vertices, int);
135- r_visit(player_ptr, y1, x1, y2, x2, randint0(num_vertices), 0, visited);
133+ std::vector<int> visited(num_vertices);
134+ r_visit(player_ptr, y1, x1, y2, x2, randint0(num_vertices), 0, visited.data());
136135 if (is_vault)
137136 fill_treasure(player_ptr, x1, x2, y1, y2, randint1(5));
138-
139- C_KILL(visited, num_vertices, int);
140137 }
--- a/src/room/rooms-vault.cpp
+++ b/src/room/rooms-vault.cpp
@@ -938,7 +938,6 @@ static void build_mini_c_vault(player_type *player_ptr, POSITION x0, POSITION y0
938938 POSITION dy, dx;
939939 POSITION y1, x1, y2, x2, y, x, total;
940940 int m, n, num_vertices;
941- int *visited;
942941
943942 msg_print_wizard(player_ptr, CHEAT_DUNGEON, _("小型チェッカーランダムVaultを生成しました。", "Mini Checker Board Vault."));
944943
@@ -1006,10 +1005,10 @@ static void build_mini_c_vault(player_type *player_ptr, POSITION x0, POSITION y0
10061005 num_vertices = m * n;
10071006
10081007 /* initialize array of visited vertices */
1009- C_MAKE(visited, num_vertices, int);
1008+ std::vector<int> visited(num_vertices);
10101009
10111010 /* traverse the graph to create a spannng tree, pick a random root */
1012- r_visit(player_ptr, y1, x1, y2, x2, randint0(num_vertices), 0, visited);
1011+ r_visit(player_ptr, y1, x1, y2, x2, randint0(num_vertices), 0, visited.data());
10131012
10141013 /* Make it look like a checker board vault */
10151014 for (x = x1; x <= x2; x++) {
@@ -1037,8 +1036,6 @@ static void build_mini_c_vault(player_type *player_ptr, POSITION x0, POSITION y0
10371036
10381037 /* Fill with monsters and treasure, highest difficulty */
10391038 fill_treasure(player_ptr, x1, x2, y1, y2, 10);
1040-
1041- C_KILL(visited, num_vertices, int);
10421039 }
10431040
10441041 /* Build a castle */
--- a/src/save/floor-writer.cpp
+++ b/src/save/floor-writer.cpp
@@ -57,17 +57,12 @@ void wr_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
5757 * 515 will be "0xff" "0xff" "0x03"
5858 */
5959
60- /* Fake max number */
61- uint16_t max_num_temp = 255;
62-
63- grid_template_type *templates;
64- C_MAKE(templates, max_num_temp, grid_template_type);
65- uint16_t num_temp = 0;
60+ std::vector<grid_template_type> templates;
6661 for (int y = 0; y < floor_ptr->height; y++) {
6762 for (int x = 0; x < floor_ptr->width; x++) {
6863 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
69- int i;
70- for (i = 0; i < num_temp; i++) {
64+ uint i;
65+ for (i = 0; i < templates.size(); i++) {
7166 if (templates[i].info == g_ptr->info && templates[i].feat == g_ptr->feat && templates[i].mimic == g_ptr->mimic
7267 && templates[i].special == g_ptr->special) {
7368 templates[i].occurrence++;
@@ -75,37 +70,23 @@ void wr_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
7570 }
7671 }
7772
78- if (i < num_temp)
73+ if (i < templates.size())
7974 continue;
8075
81- if (num_temp >= max_num_temp) {
82- grid_template_type *old_template = templates;
83- C_MAKE(templates, max_num_temp + 255, grid_template_type);
84- (void)C_COPY(templates, old_template, max_num_temp, grid_template_type);
85- C_KILL(old_template, max_num_temp, grid_template_type);
86- max_num_temp += 255;
87- }
88-
89- templates[num_temp].info = g_ptr->info;
90- templates[num_temp].feat = g_ptr->feat;
91- templates[num_temp].mimic = g_ptr->mimic;
92- templates[num_temp].special = g_ptr->special;
93- templates[num_temp].occurrence = 1;
94- num_temp++;
76+ templates.push_back({g_ptr->info, g_ptr->feat, g_ptr->mimic, g_ptr->special, 1});
9577 }
9678 }
9779
9880 int dummy_why;
99- ang_sort(player_ptr, templates, &dummy_why, num_temp, ang_sort_comp_cave_temp, ang_sort_swap_cave_temp);
81+ ang_sort(player_ptr, templates.data(), &dummy_why, templates.size(), ang_sort_comp_cave_temp, ang_sort_swap_cave_temp);
10082
10183 /*** Dump templates ***/
102- wr_u16b(num_temp);
103- for (int i = 0; i < num_temp; i++) {
104- grid_template_type *ct_ptr = &templates[i];
105- wr_u16b((uint16_t)ct_ptr->info);
106- wr_s16b(ct_ptr->feat);
107- wr_s16b(ct_ptr->mimic);
108- wr_s16b(ct_ptr->special);
84+ wr_u16b(static_cast<uint16_t>(templates.size()));
85+ for (const auto &ct_ref : templates) {
86+ wr_u16b(static_cast<uint16_t>(ct_ref.info));
87+ wr_s16b(ct_ref.feat);
88+ wr_s16b(ct_ref.mimic);
89+ wr_s16b(ct_ref.special);
10990 }
11091
11192 byte count = 0;
@@ -113,8 +94,8 @@ void wr_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
11394 for (int y = 0; y < floor_ptr->height; y++) {
11495 for (int x = 0; x < floor_ptr->width; x++) {
11596 grid_type *g_ptr = &floor_ptr->grid_array[y][x];
116- int i;
117- for (i = 0; i < num_temp; i++) {
97+ uint i;
98+ for (i = 0; i < templates.size(); i++) {
11899 if (templates[i].info == g_ptr->info && templates[i].feat == g_ptr->feat && templates[i].mimic == g_ptr->mimic
119100 && templates[i].special == g_ptr->special)
120101 break;
@@ -148,8 +129,6 @@ void wr_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
148129 wr_byte((byte)prev_u16b);
149130 }
150131
151- C_KILL(templates, max_num_temp, grid_template_type);
152-
153132 /*** Dump objects ***/
154133 wr_u16b(floor_ptr->o_max);
155134 for (int i = 1; i < floor_ptr->o_max; i++) {
--- a/src/term/z-form.cpp
+++ b/src/term/z-form.cpp
@@ -648,38 +648,30 @@ uint vstrnfmt(char *buf, uint max, concptr fmt, va_list vp)
648648 */
649649 char *vformat(concptr fmt, va_list vp)
650650 {
651- static char *format_buf = nullptr;
652- static ulong format_len = 0;
653-
654651 /* Initial allocation */
655- if (!format_buf) {
656- format_len = 1024;
657- C_MAKE(format_buf, format_len, char);
658- }
652+ static std::vector<char> format_buf(1024);
659653
660654 /* Null format yields last result */
661655 if (!fmt)
662- return (format_buf);
656+ return format_buf.data();
663657
664658 /* Keep going until successful */
665659 while (true) {
666660 uint len;
667661
668662 /* Build the string */
669- len = vstrnfmt(format_buf, format_len, fmt, vp);
663+ len = vstrnfmt(format_buf.data(), format_buf.size(), fmt, vp);
670664
671665 /* Success */
672- if (len < format_len - 1)
666+ if (len < format_buf.size() - 1)
673667 break;
674668
675669 /* Grow the buffer */
676- C_KILL(format_buf, format_len, char);
677- format_len = format_len * 2;
678- C_MAKE(format_buf, format_len, char);
670+ format_buf.resize(format_buf.size() * 2);
679671 }
680672
681673 /* Return the new buffer */
682- return (format_buf);
674+ return format_buf.data();
683675 }
684676
685677 /*
--- a/src/wizard/monster-info-spoiler.cpp
+++ b/src/wizard/monster-info-spoiler.cpp
@@ -76,7 +76,6 @@ spoiler_output_status spoil_mon_desc(concptr fname, std::function<bool(const mon
7676 {
7777 player_type dummy;
7878 uint16_t why = 2;
79- MONRACE_IDX *who;
8079 char buf[1024];
8180 char nam[MAX_MONSTER_NAME + 10]; // ユニークには[U] が付くので少し伸ばす
8281 char lev[80];
@@ -94,7 +93,6 @@ spoiler_output_status spoil_mon_desc(concptr fname, std::function<bool(const mon
9493 char title[200];
9594 put_version(title);
9695
97- C_MAKE(who, max_r_idx, MONRACE_IDX);
9896 fprintf(spoiler_file, "Monster Spoilers for %s\n", title);
9997 fprintf(spoiler_file, "------------------------------------------\n\n");
10098 fprintf(spoiler_file, "%-45.45s%4s %4s %4s %7s %7s %19.19s\n", "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info");
@@ -104,15 +102,15 @@ spoiler_output_status spoil_mon_desc(concptr fname, std::function<bool(const mon
104102 "----------",
105103 "---", "---", "---", "-----", "-----", "-------------------");
106104
107- int n = 0;
105+ std::vector<MONRACE_IDX> who;
108106 for (const auto &r_ref : r_info) {
109107 if (r_ref.idx > 0 && !r_ref.name.empty())
110- who[n++] = r_ref.idx;
108+ who.push_back(r_ref.idx);
111109 }
112110
113- ang_sort(&dummy, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
114- for (auto i = 0; i < n; i++) {
115- monster_race *r_ptr = &r_info[who[i]];
111+ ang_sort(&dummy, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
112+ for (auto r_idx : who) {
113+ monster_race *r_ptr = &r_info[r_idx];
116114 concptr name = r_ptr->name.c_str();
117115 if (filter_monster && !filter_monster(r_ptr)) {
118116 continue;
@@ -161,7 +159,6 @@ spoiler_output_status spoil_mon_desc(concptr fname, std::function<bool(const mon
161159 }
162160
163161 fprintf(spoiler_file, "\n");
164- C_KILL(who, max_r_idx, int16_t);
165162 return ferror(spoiler_file) || angband_fclose(spoiler_file) ? spoiler_output_status::SPOILER_OUTPUT_FAIL_FCLOSE
166163 : spoiler_output_status::SPOILER_OUTPUT_SUCCESS;
167164 }
@@ -199,18 +196,16 @@ spoiler_output_status spoil_mon_info(concptr fname)
199196 spoil_out(buf);
200197 spoil_out("------------------------------------------\n\n");
201198
202- MONRACE_IDX *who;
203- C_MAKE(who, max_r_idx, MONRACE_IDX);
204- int n = 0;
199+ std::vector<MONRACE_IDX> who;
205200 for (const auto &r_ref : r_info) {
206201 if (r_ref.idx > 0 && !r_ref.name.empty())
207- who[n++] = r_ref.idx;
202+ who.push_back(r_ref.idx);
208203 }
209204
210205 uint16_t why = 2;
211- ang_sort(&dummy, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
212- for (int i = 0; i < n; i++) {
213- monster_race *r_ptr = &r_info[who[i]];
206+ ang_sort(&dummy, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
207+ for (auto r_idx : who) {
208+ monster_race *r_ptr = &r_info[r_idx];
214209 BIT_FLAGS flags1 = r_ptr->flags1;
215210 if (any_bits(flags1, RF1_UNIQUE)) {
216211 spoil_out("[U] ");
@@ -225,7 +220,7 @@ spoiler_output_status spoil_mon_info(concptr fname)
225220 spoil_out(buf);
226221 sprintf(buf, "=== ");
227222 spoil_out(buf);
228- sprintf(buf, "Num:%d ", who[i]);
223+ sprintf(buf, "Num:%d ", r_idx);
229224 spoil_out(buf);
230225 sprintf(buf, "Lev:%d ", (int)r_ptr->level);
231226 spoil_out(buf);
@@ -249,11 +244,10 @@ spoiler_output_status spoil_mon_info(concptr fname)
249244 spoil_out(buf);
250245 sprintf(buf, "Exp:%ld\n", (long)(r_ptr->mexp));
251246 spoil_out(buf);
252- output_monster_spoiler(who[i], roff_func);
247+ output_monster_spoiler(r_idx, roff_func);
253248 spoil_out(nullptr);
254249 }
255250
256- C_KILL(who, max_r_idx, int16_t);
257251 return ferror(spoiler_file) || angband_fclose(spoiler_file) ? spoiler_output_status::SPOILER_OUTPUT_FAIL_FCLOSE
258252 : spoiler_output_status::SPOILER_OUTPUT_SUCCESS;
259253 }
--- a/src/wizard/wizard-special-process.cpp
+++ b/src/wizard/wizard-special-process.cpp
@@ -596,11 +596,7 @@ void wiz_dump_options(void)
596596 return;
597597 }
598598
599- int **exist;
600- C_MAKE(exist, NUM_O_SET, int *);
601- C_MAKE(*exist, NUM_O_BIT * NUM_O_SET, int);
602- for (int i = 1; i < NUM_O_SET; i++)
603- exist[i] = *exist + i * NUM_O_BIT;
599+ std::vector<std::vector<int>> exist(NUM_O_SET, std::vector<int>(NUM_O_BIT));
604600
605601 for (int i = 0; option_info[i].o_desc; i++) {
606602 const option_type *ot_ptr = &option_info[i];
@@ -626,8 +622,6 @@ void wiz_dump_options(void)
626622 fputc('\n', fff);
627623 }
628624
629- C_KILL(*exist, NUM_O_BIT * NUM_O_SET, int);
630- C_KILL(exist, NUM_O_SET, int *);
631625 angband_fclose(fff);
632626 msg_format(_("オプションbit使用状況をファイル %s に書き出しました。", "Option bits usage dump saved to file %s."), buf);
633627 }
旧リポジトリブラウザで表示