Wie kann ich die Größe eines Arrays in C ändern?

Lesezeit: 3 Minuten

Benutzer-Avatar
Aaron de Windt

Ich experimentiere ein wenig mit Gamestudio. Ich mache jetzt ein Shooter-Spiel. Ich habe ein Array mit den Zeigern auf die Feinde. Wenn ein Feind getötet wird, möchte ich ihn von der Liste entfernen. Und ich möchte auch in der Lage sein, neue Feinde zu erschaffen.

Gamestudio verwendet eine Skriptsprache namens lite-C. Es hat die gleiche Syntax wie C und auf der Website heißt es, dass es mit jedem C-Compiler kompiliert werden kann. Es ist reines C, kein C++ oder irgendetwas anderes.

Ich bin neu in C. Normalerweise programmiere ich in .NET-Sprachen und einigen Skriptsprachen.

Benutzer-Avatar
dan04

Du kannst nicht. Dies geschieht normalerweise mit dynamischer Speicherzuweisung.

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

  • x = realloc(x, ...) ist ein Speicherleck, das darauf wartet, passiert zu werden. (Mir ist jedoch klar, dass es nicht der Zweck dieser Antwort war, zu demonstrieren, wie mit dynamischen Zuordnungsfehlern umgegangen wird.)

    – bk1e

    30. September 2010 um 15:40 Uhr

  • Stimmt, und ich hätte prüfen sollen, ob malloc kehrt zurück NULL auch.

    – dan04

    30. September 2010 um 16:08 Uhr

  • Antwort bearbeitet (Peer-Review ausstehend), um eine ordnungsgemäße Fehlerprüfung durchzuführen, da sie bereits als Ziel für Dupmarking und als ~ 24.000 Aufrufe verwendet wird.

    – Bodo Thiesen

    29. November 2016 um 22:44 Uhr


Sobald ein Array in C erstellt wurde, wird es festgelegt. Sie benötigen eine dynamische Datenstruktur wie eine Linked List oder eine ArrayList

Arrays sind statisch, sodass Sie ihre Größe nicht ändern können. Sie müssen die Datenstruktur der verknüpften Liste erstellen. Die Liste kann bei Bedarf wachsen und schrumpfen.

Schauen Sie sich an realloc Dadurch können Sie die Größe des Speichers ändern, auf den ein bestimmter Zeiger zeigt (in C sind Arrays Zeiger).

Wie NickTFried vorgeschlagen hat, ist Linked List eine Möglichkeit. Eine andere ist, einen Tisch zu haben, der groß genug ist, um die maximale Anzahl von Gegenständen aufzunehmen, die Sie jemals haben werden, und dies zu verwalten (welche gültig sind oder nicht, wie viele Feinde sich derzeit in der Liste befinden).

Was die Größenänderung betrifft, müssten Sie einen Zeiger anstelle einer Tabelle verwenden und Sie könnten neu zuweisen, kopieren und so weiter … definitiv nicht etwas, was Sie in einem Spiel tun möchten.

Wenn die Leistung ein Problem ist (und ich vermute, dass dies der Fall ist), würde ich wahrscheinlich die richtig zugewiesene Tabelle verwenden.

  • Es ist immer noch eine Array-Implementierung einer Liste. Sie haben jedoch Recht, es erfordert die Kenntnis der maximalen Arraygröße.

    Benutzer173424

    30. September 2010 um 5:17 Uhr

Benutzer-Avatar
Ev0lv3zz

Ich wollte die Array-Größe verringern, funktionierte aber nicht wie folgt:

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

Also habe ich versucht, ein neues zu erstellen, dessen Größe auf einer gespeicherten Anzahl basiert.

int count = 0;

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

int positives[count];

Und dann übergeben Sie die Elemente im ersten Array erneut, um sie dem neuen hinzuzufügen.

//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++; }
}

Und hier haben wir ein brandneues Array mit der genauen Anzahl von Elementen, die wir wollen (in meinem Fall).

  • Es ist immer noch eine Array-Implementierung einer Liste. Sie haben jedoch Recht, es erfordert die Kenntnis der maximalen Arraygröße.

    Benutzer173424

    30. September 2010 um 5:17 Uhr

1180330cookie-checkWie kann ich die Größe eines Arrays in C ändern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy