Как я могу изменить размер массива в C? - PullRequest
12 голосов
/ 30 сентября 2010

Я немного экспериментирую с gamestudio. Сейчас я делаю шутер. У меня есть массив с указателями на врагов. Я хочу. когда враг убит. удалить его из списка. И я также хочу иметь возможность создавать новых врагов.

Gamestudio использует язык сценариев с именем lite-C. Он имеет тот же синтаксис, что и C, и на сайте говорят, что его можно скомпилировать любым компилятором C. Это чистый C, никакой C ++ или что-либо еще.

Я новичок в C. Обычно я программирую на языках .NET и некоторых языках сценариев,

Ответы [ 5 ]

24 голосов
/ 30 сентября 2010

Вы не можете.Обычно это делается с помощью динамического выделения памяти.

// Like "ENEMY enemies[100]", but from the heap
ENEMY* enemies = malloc(100 * sizeof(ENEMY));
if (!enemies) { error handling }

// You can index pointers just like arrays.
enemies[0] = CreateEnemy();

// Make the array bigger
ENEMY* more_enemies = realloc(enemies, 200 * sizeof(ENEMY));
if (!more_enemies) { error handling }
enemies = more_enemies;

// Clean up when you're done.
free(enemies);
3 голосов
/ 30 сентября 2010

Массивы статичны, поэтому вы не сможете изменить их размер. Вам необходимо создать структуру данных связанного списка.Список может увеличиваться и уменьшаться по требованию.

1 голос
/ 30 сентября 2010

Как только массив в C был создан, он устанавливается. Вам нужна динамическая структура данных, такая как Linked List или ArrayList

0 голосов
/ 30 сентября 2010

Как предложил NickTFried, Linked List - это один из способов. Другой - иметь достаточно большой стол, чтобы вместить максимальное количество предметов, которое у вас когда-либо будет, и управлять этим (какие из них действительны или нет, сколько врагов в настоящее время в списке).

Что касается изменения размера, вам придется использовать указатель вместо таблицы, и вы можете перераспределять, копировать и так далее ... определенно не то, что вы хотите делать в игре.

Если производительность - это проблема (и я предполагаю, что это так), то, вероятно, я бы использовал таблицу, правильно распределенную.

0 голосов
/ 30 сентября 2010

Взгляните на realloc, который позволит вам изменить размер памяти, на которую указывает данный указатель (который в C, массивы - указатели).

...