2010-09-30 2 views
10

Sto sperimentando un po 'con gamestudio. Sto facendo ora un gioco sparatutto. Ho una matrice con il puntatore ai nemici. Voglio. a quando un nemico viene ucciso. rimuovilo dalla lista. E voglio anche essere in grado di creare nuovi nemici.Come posso cambiare la dimensione di un array in C?

Gamestudio utilizza un linguaggio di scripting denominato lite-C. Ha la stessa sintassi di C e sul sito web che dicono, che può essere compilato con qualsiasi compilatore C. È pura C, no C++ o qualsiasi altra cosa.

Sono nuovo di C. Io di solito programma in linguaggi .NET e alcuni linguaggi di scripting,

risposta

0

Una volta un array in C è stato creato, è impostato. Hai bisogno di una struttura dati dinamica come un elenco collegato o un ArrayList

0

Dai un'occhiata a realloc che ti permetterà di ridimensionare la memoria puntata da un dato puntatore (che, in C, gli array sono puntatori).

+1

Credo che per far funzionare l'array deve essere un array assegnato da malloc, non in pila. Inoltre, tieni presente che se non riesce ad allocare sul posto libererà il vecchio blocco e assegnerà un nuovo blocco. Ciò invalida tutti i puntatori nel blocco originale. –

+0

Ah, sì. Entrambe devono essere prese in considerazione se si intende utilizzare realloc. – dj2

+0

Gli array non sono puntatori. Le matrici decadono ai puntatori quando passano a una funzione. Un array e un puntatore sono due cose molto diverse. – Robbie

3

Gli array sono statici quindi non sarà possibile modificarne le dimensioni. È necessario creare la struttura dati dell'elenco collegato. L'elenco può crescere e restringersi su richiesta.

0

Come suggerito da NickTFried, la lista collegata è un modo per andare. Un altro è avere un tavolo abbastanza grande da contenere il numero massimo di oggetti che possiedi e gestirlo (quali sono validi o meno, quanti nemici sono attualmente nella lista).

Per quanto riguarda il ridimensionamento, dovresti usare un puntatore al posto di un tavolo e potresti riallocarlo, copiarlo e così via ... decisamente non è qualcosa che vuoi fare in un gioco.

Se la prestazione è un problema (e suppongo che lo sia), la tabella correttamente allocata è probabilmente quella che userei.

+0

È ancora un'implementazione dell'array di un elenco. Hai ragione, richiede la conoscenza della dimensione massima dell'array. –

19

Non è possibile. Questo è normalmente fatto con allocazione dinamica della memoria.

// 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, ...)' è una perdita di memoria in attesa di accadere. (Tuttavia, mi rendo conto che dimostrando come gestire gli errori di allocazione dinamica non era il punto di questa risposta.) – bk1e

+1

Vero, e avrei dovuto verificare se 'malloc' restituisce' NULL' pure. – dan04

+1

Risposta modificata (in attesa di revisione paritetica) per eseguire correttamente il controllo degli errori, poiché viene utilizzata come destinazione per il dupmarking e come già viste ~ 24k. –