2009-10-20 22 views
24

Ho una matrice di strutture che ho creato da qualche parte nel mio programma.Iterate attraverso un array C

In seguito, desidero ripetere, ma non ho la dimensione dell'array.

Come posso scorrere tra gli elementi? O devo memorizzare le dimensioni da qualche parte?

risposta

18

È possibile memorizzare la dimensione da qualche parte, oppure è possibile avere una struttura con un set di valori speciali che si utilizza come sentinella, allo stesso modo che '\ 0' indica la fine di una stringa.

+4

+1 Di solito uso i puntatori alle strutture in modo da essere sicuro che 'NULL' è una sentinella univoca. –

+5

Penso che seguire il modello a stringa con terminazione nulla sia una cattiva idea – hasen

+0

@hasen j: Sono d'accordo, a meno che tu non sappia che devi sempre ripetere l'intero array ogni volta, nel qual caso una sentinella può chiarire leggermente il codice. Il problema con la sentinella è che si può finire con il comportamento di O (N) dove O (1) avrebbe fatto, e non sempre lo si comprende. – quark

39

Se la dimensione dell'array è nota al momento della compilazione, è possibile utilizzare la dimensione della struttura per determinare il numero di elementi.

struct foo fooarr[10]; 

for(i = 0; i < sizeof(fooarr)/sizeof(struct foo); i++) 
{ 
    do_something(fooarr[i].data); 
} 

Se non è noto al momento della compilazione, è necessario memorizzare una dimensione da qualche parte o creare un valore speciale terminatore alla fine della matrice.

+3

Aggh sei stato più veloce !! Stavo modificando la mia risposta lol :) – AntonioMO

+1

Infatti, ma preferisco usare 'sizeof (fooarr [0])' o 'sizeof (* fooarr)' di 'sizeof (struct foo)' – gatopeich

9

Dipende. Se si tratta di un array allocato dinamicamente, cioè, lo hai creato chiamando malloc, poi come altri suggeriscono che devi salvare la dimensione della matrice/numero di elementi da qualche parte o avere una sentinella (una struct con un valore speciale, che sarà la l'ultimo).

Se si tratta di un array statico, è possibile ridimensionare le dimensioni/le dimensioni di un elemento. Per esempio:

int array[10], array_size; 
... 
array_size = sizeof(array)/sizeof(int); 

Si noti che, a meno che sia globale, questo funziona solo nel campo di applicazione in cui si inizializza la matrice, perché se passato ad un'altra funzione si arriva decaduto a un puntatore.

Spero che aiuti.

+1

Non si tratta di stabilire se l'array è assegnato o meno dinamicamente. Si tratta di wheteher hai permesso al tipo di array di decadere al tipo di puntatore. Per esempio, posso creare una matrice allocata dynamicillay come questa 'int (* a) [10] = malloc (sizeof * a)' e usare 'sizeof * a/sizeof ** a' per" determinare "il numero di elementi dopo . Non è necessario memorizzare le dimensioni separatamente. – AnT

+7

+1, anche se è leggermente preferibile fare 'sizeof (array)/sizeof (array [0])' in modo che funzioni ancora se il tipo di array sottostante cambia; questo modulo consente inoltre di definire facilmente una macro, ad es. '#define ARRAY_COUNT (a) (sizeof (a)/(sizeof (a [0]))'. –

+0

Lo stesso vale per il passaggio a una funzione. Tutto dipende da come lo passi. – AnT

0

Penso che dovresti conservare la dimensione da qualche parte.

Il tipo di stringa con terminazione null del modello per determinare la lunghezza dell'array è una cattiva idea. Ad esempio, ottenere la dimensione dell'array sarà O (N) quando potrebbe facilmente essere O (1) altrimenti.

Detto questo, una buona soluzione potrebbe essere glib's Arrays, hanno il vantaggio di espandersi automaticamente se è necessario aggiungere più articoli.

P.S. per essere completamente onesto, non ho usato molto glib, ma penso che sia una libreria (molto) stimabile.

Problemi correlati