Newsgroup: it.comp.lang.c
Titolo: lunghezza array

salve, esiste un metodo che ritorna la lunghezza di un array in c o devo
fare un ciclo di for?
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 fare un ciclo di for?
E che "ciclo di for" vorresti fare, scusa?
Ci sono due modi in cui un array può essere instanziato in C.
1. variabile automatica o globale di tipo array:
       int a[ 100 ];
2. blocco di memoria allocato mediante 'malloc':
   int* p = malloc( 100 * sizeof(int) );
Nel primo caso la lunghezza (i.e. numero elementi) dell'array è data da
      sizeof(a) / sizeof(int)
Nel secondo, la lunghezza è nota al programmatore (in quanto è parte
dell'argomento di malloc). (sizeof(p), invece, coincide con sizeof(int*), e
non dipende dalla dimensione del blocco allocato da 'malloc'.)
Se di un array conosci *soltanto* l'indirizzo del primo elemento, non c'è
modo di conoscerne la lunghezza. Se in un punto del programma devi usare un
array senza poterne conoscere la lunghezza, il programma è scritto male.
E' ovviamente possibile adottare una convenzione che consenta di riconoscere
l'ultimo elemento dell'array. Ad esempio, le cosidette stringhe
"null-terminated" sono array di char il cui ultimo elemento vale '\0'.
Convenzioni analoghe vengono spesso usate per altri tipi di array: ad
esempio, array di puntatori, in cui l'ultimo elemento viene
convenzionalmente impostato a NULL.
Quando un array viene passato a una funzione, decade nel puntatore al primo
elemento e si danno 4 possibili situazioni:
 1. la dimensione (minima possibile) dell'array è stabilita a priori
 2. la dimensione dell'array è passata come ulteriore argomento della
funzione
 3. la dimensione dell'array è ricavata tramite qualche convenzione
ispezionando il contenuto dell'array stesso (cfr., ad es., strlen)
 4. il programma è scritto male
Max

 fare un ciclo di for?
Dimensione dell'array / dimensione del singolo elemento.
Pero` deve essere valutabile a compile time.
Per es:
struct esempio_s esempio[100]; // array
num_di_elem = sizeof(esempio) / sizeof(struct esempio_s);
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

fare un ciclo di for?
Non esiste ciclo for che tenga, di default.
In generale la tecnica è:
#define ITEM_COUNT(a) (sizeof((a))/sizeof((a)[0]))
...
int x[50], count;
count = ITEM_COUNT(x);
Se proprio vuoi usare un ciclo for, allora utilizza un valore
"sentinella":
#define SENTINEL 0
int x[10] = {1,2,3,4,5,6,7, SENTINEL};
...
int i, count=0;
for (i=0; x[i] != SENTINEL; i++)
  ++count;
Questo è il metodo che viene usato con argv (il parametro di main()),
ad esempio.

 ad esempio.
In ogni modo nel caso del main hai anche l'informazione di "argc".
--
Giorgio Silvestri
DSP/Embedded/Real Time OS   Software Engineer

In ogni modo nel caso del main hai anche l'informazione di "argc".
Acc... ecco cos'era quell'int definito come primo parametro.
Grazie dell'illuminazione.

"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel
messaggio news:ffakl2lbi8bkh2tjm...@4ax.com...

Non credo che la mia precisazione sia così sciocca.
Volevo solo enfatizzare che ha più senso trovare
la dimensione di un array quando non la conosci.
Nel caso di main hai un'informazione in più che
può evitarti di calcolare qualcosa che sai già.


   ++count;
Ottimizzando un po' si può fare:
 int i, count;
for (i=0; x[i] != SENTINEL; i++);
count = i;
C'è già "i" che conta e si incrementa, non c'è bisogno di farlo fare anche a
"count" che potrebbe anche essere eliminata.

 count = i;
volendo le assegnazioni sono inutili
int i = 0
while(x[i] != SENTINEL)
	++i;
int count = i;

"Davide Quack" ha scritto


Di cosa stai parlando? Di quali assegnazioni?
Quello che hai scritto fa la stessa cosa di quello che avevo scritto io.
- inizializzazione di i
- loop
    - confronto di x[i] con SENTINEL
    - incremento di i
- assegnazione finale a count (opzionale, si può usare la variabile i
stessa)
Puoi spiegare meglio? Grazie.
Marco

 Puoi spiegare meglio? Grazie.
Lasci perdere. Ho visto adesso il punto e virgola alla fine del for.
Mi sono sbagliato. Credevo che il codice fosse:
for (i=0; x[i] != SENTINEL; i++)
	count = i;
invece di quello che realmente hai scritto, ovvero
for (i=0; x[i] != SENTINEL; i++)
	;
count = i;
L'identazione a cui non sono abituato mi ha fregato.
Capita.