2010-09-30 10 views
10

Estoy experimentando un poco con gamestudio. Ahora estoy haciendo un juego de disparos. Tengo una matriz con el puntero a los enemigos. Yo quiero. a cuando un enemigo es asesinado eliminarlo de la lista. Y también quiero poder crear nuevos enemigos.¿Cómo puedo cambiar el tamaño de una matriz en C?

Gamestudio utiliza un lenguaje de scripting llamado lite-C. Tiene la misma sintaxis que C y en el sitio web dicen que se puede compilar con cualquier compilador de C. Es C puro, sin C++ o cualquier otra cosa.

Soy nuevo en C. Normalmente programa en lenguajes .NET y algunos lenguajes de script,

Respuesta

0

Una vez que se ha creado una matriz en C, se establece. Necesita una estructura de datos dinámica como una lista vinculada o una lista de matrices

0

Mire realloc que le permitirá cambiar el tamaño de la memoria apuntada por un puntero dado (que, en C, las matrices son punteros).

+1

Creo que para que esto funcione la matriz debe ser una matriz asignada por malloc, no en la pila. Y también se advirtió que si no se asigna in situ, liberará el bloque antiguo y asignará un nuevo bloque. Esto invalida cualquier puntero en el bloque original. –

+0

Ah, sí. Ambos deben tenerse en cuenta si va a utilizar realloc. – dj2

+0

Las matrices no son punteros. Las matrices decaen a punteros cuando pasan a una función. Una matriz y un puntero son dos cosas muy diferentes. – Robbie

3

Las matrices son estáticas, por lo que no podrá cambiar su tamaño. Deberá crear la estructura de datos de la lista vinculada. La lista puede crecer y reducirse a pedido.

0

Como NickTFried sugirió, la Lista de enlaces es una manera de hacerlo. Otra es tener una mesa lo suficientemente grande como para contener la cantidad máxima de elementos que tendrás y administrar (cuáles son válidos o no, cuántos enemigos hay actualmente en la lista).

En cuanto al cambio de tamaño, tendría que usar un puntero en lugar de una tabla y podría reasignar, copiar, y así sucesivamente ... definitivamente no es algo que desee hacer en un juego.

Si el rendimiento es un problema (y supongo que sí), la tabla correctamente asignada es probablemente la que usaría.

+0

Sigue siendo una implementación de matriz de una lista. Tienes razón, requiere conocimiento del tamaño máximo de la matriz. –

19

No puede. Esto normalmente se hace con la asignación de memoria dinámica.

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

'x = realloc (x, ...)' es una pérdida de memoria esperando a suceder. (Sin embargo, me doy cuenta de que la demostración de cómo manejar las fallas de asignación dinámica no era el objetivo de esta respuesta). – bk1e

+1

Es cierto, y debería haber comprobado si 'malloc' devuelve' NULL' también. – dan04

+1

Respuesta editada (pendiente de revisión por pares) para realizar una comprobación de errores adecuada, ya que se está utilizando como destino para dupmarking y como ~ 24k de vistas. –

Cuestiones relacionadas