web-dev-qa-db-ja.com

Cで配列のサイズを変更するにはどうすればよいですか?

ゲームスタジオで少し実験しています。今シューティングゲームを作っています。私は敵へのポインターの配列を持っています。が欲しいです。敵が殺されるときまで。リストから彼を削除します。また、新しい敵を作れるようになりたいです。

Gamestudioは、lite-Cという名前のスクリプト言語を使用します。それはCと同じ構文を持ち、彼らが言うウェブサイトでは、それは任意のCコンパイラでコンパイルすることができます。それは純粋なCであり、C++などではありません。

Cは初めてです。通常、.NET言語と一部のスクリプト言語でプログラミングします。

12
Aaron de Windt

Cの配列が作成されると、設定されます。 Linked ListやArrayListのような動的なデータ構造が必要です

1
user180825

できません。これは通常、動的メモリ割り当てで行われます。

// 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);
24
dan04

配列は静的なので、サイズを変更することはできません。リンクリストのデータ構造を作成する必要があります。リストは必要に応じて拡大および縮小できます。

3
user173424

配列サイズを小さくしたかったのですが、次のように機能しませんでした。

myArray = new int[10];//Or so.

そこで、保存されたカウントに基づいたサイズで、新しいものを作成してみました。

int count = 0;

for (int i = 0; i < sizeof(array1)/sizeof(array1[0]); i++){
  if (array1[i] > 0) count++;
}

int positives[count];

次に、最初の配列の要素を再度渡し、新しい配列に追加します。

//Create the new array element reference.

int x = 0;

for (int i = 0; i < sizeof(array1)/sizeof(array1[0]); i++){
  if (array1[i] > 0){ positives[x] = array1[i]; x++; }
}

そして、ここに、必要な要素の正確な数を含む新しい配列があります(私の場合)。

0
Ev0lv3zz

reallocを見てください。これにより、特定のポインター(Cでは配列はポインター)が指すメモリーのサイズを変更できます。

0
dj2

NickTFriedが示唆したように、Linked Listは1つの方法です。もう1つは、これまでに持っているアイテムの最大数を保持し、それを管理するのに十分な大きさのテーブルを用意することです(どのアイテムが有効か、有効でないか、現在リストにある敵の数)。

サイズ変更に関しては、テーブルの代わりにポインターを使用する必要があり、再割り当て、コピーオーバーなどを行うことができます...ゲームでやりたいことは間違いありません。

パフォーマンスが問題である(そして私がそれを推測している)場合、適切に割り当てられたテーブルがおそらく私が使用するものです。

0
Matthieu