Newsgroup: it.comp.lang.c++
Titolo: lunghezza array in C

buongiorno
esiste in c qualcosa tipo lenght() o Size() che restituisca il numero di 
elementi di un array?
vi ringrazio

buddy ha scritto:

No. Un array e` solo una porzione di memoria contigua precedentemente 
allocata. Senza nessun altra roba che possa complicare la situazione. 
Quindi sta a te gestire la cosa, ovvero portarti dietro il suo size, 
anche perche`, se l'hai dichiarato (o allocato dinamicamente), da 
qualche parte hai dovuto scrivere la sua dimensione.
A presto

buddy ha scritto:

Comunque sei sull'NG sbagliato :)

 elementi di un array?
int a[100];
int length;
length = sizeof(a) / sizeof(int);
size() esiste per i tipi vector<> del C++
Dr. Atlantis

 
vabbè, ma quello vale solo "in scope" con la dichiarazione e 
definizione, caso in cui normalmente puoi conoscere 
ugualmente la dimensione guardando nella stessa unità di 
compilazione, se non proprio qualche pagina più in alto.
Quel costrutto invece non funge ad es. se lo dichiari dentro 
una funzione relativamente a un parametro passatole.
Quindi la risposta più generale alla domanda dell'OP è no : 
plain arrays nudi e crudi, non registrano da nessuna parte 
la dimensione, a meno che non si tratti di variabili 
statiche (delle quali il compilatore stesso tiene traccia).
Gli array statici sono di dimensioni note ovunque siano 
anche accessibili.
ciao
Soviet


 una funzione relativamente a un parametro passatole.
Parametro che infatti *non* e' un array, ma e' decaduto a puntatore. 
-- 
-riko


Applicando un po' di "OOP" al C, si può fare così:
typedef struct {
   char *memory;
   size_t size;
}Array;
ogni volta che lo allochi, tieni conto della dimensione e modifichi
opportunamente size.
Magari con funzioni apposta, tipo
array_new() //Crea un nuovo array
array_set_size()
array_get_size()
array_expand() //Rialloca e aggiunge memoria
array_release() //Free della memoria
array_get_item_at() // memory[i]
array_set_item_at() // memory[i] = valore
e così hai qualcosa di vagamente oop, più gestibile.
Ciao,
Marco.

 Applicando un po' di "OOP" al C, si pu� fare cos�:
Guarda, di librerie del genere se ne sono viste a pacchi. Credo che
ognuno di noi se ne potrebbe pure essere scritta una nella vita. Io ne
ricordo almeno un paio pennate dal sottoscritto tipo dieci anni fa. 
Attenzione pero' a non fare le cose ingenue. 
Cosa succede in questo caso?
int foo(Array a) {
    array_expand(&a, ...);
}
...
foo(m);
m->size && m->memory[0];
Ma accidentaccio, sono in un gruppo di C++, non sara' meglio suggerire
semplicemente di usare i vector<> per ste robe? O al limite boost::array
(per certe altre cose).
-- 
-riko

 (per certe altre cose).
si, ma se l'OP deve lavorare in C che fa? :)
-- 
By ZeD

 si, ma se l'OP deve lavorare in C che fa? :)
Chiede su un gruppo di C?
Sicuramente non usa la proposta di cui sopra (con bachi allegati).
Potrebbe usare una qualche libreria C che contiene gia' quel tipo di
funzioni.
-- 
-riko

 funzione relativamente a un parametro passatole.
Magari gli bastava, per risolvere il suo problema puntuale.
Se invece voleva proprio la size() del C++ o la Ubound() del VB, allora fa  
prima a rinunciare piuttosto che impegolarsi in una marea di arzigogoli  
per trasformare il C in C++...
-- 
Dr. Atlantis

 Magari gli bastava, per risolvere il suo problema puntuale.
può essere, anche se ammetto che mi è sembrato irrealistico 
che uno si interroghi sulle dimensioni di un arrai nel corpo 
dello stesso scope in cui lo ha dichiarato. Giustamente ho 
fatto un'assunzione che può benissimo essere stata errata
ciao
Soviet


 dello stesso scope in cui lo ha dichiarato. 
Invece non e' cosi'. Lo fai per avere "automaticamente" la dimensione,
senza bisogno di duplicare i punti in cui e' scritto quanto e' grosso.
In questo modo ti eviti potenziali bachi.
Solo il primo motivo che mi e' venuto in mente. 
-- 
-riko

 
penso che non ci capiamo.
Secondo me i bachi e le potenziali fonti di errore nascono 
quando ti chiedi quant'è grosso l'array lontano da dov'è 
stato dichiarato. Sizeof non può garantire niente in questo 
caso più critico, per cui che funga bene in locale non mi 
sembra tanto importante (non concettualmente, parlo di 
utilità pratica).
ciao
Soviet

 chiedi quant'� grosso l'array lontano da dov'� stato dichiarato.
Parlando di utilita' pratica: "lontano" puo' anche essere nello stesso 
blocco, 10-20 righe piu' giu', ed e' facile dimenticarsi di cambiarlo quando 
cambi la dichiarazione dell'array.
Quindi sizeof in questo caso puo' essere molto utile -- scrivi la dimensione 
dell'array una volta sola, e stai tranquillo che se la cambi non sbagli 
nulla.
Pleg 

 parlo di utilit� pratica).
Non � questione che lo usi "vicino" o "lontano". Il punto � che se una 
funzione lavora su un unico array, allora ha senso codificare le 
dimensioni dell'array nel codice, altrimenti, se le dimensioni 
dell'array possono variare in runtime, necessariamente devi memorizzare 
le dimensioni in una variabile. Sicuramente il secondo caso � il pi� 
comune. Ma nel primo caso il sizeof() � la cosa giusta da usare, e 
funziona sempre, perch� se vuoi accedere ad un array, allora hai a 
disposizione la sua dichiarazione e quindi sizeof() fa il suo lavoro. Se 
invece stai accedendo all'array tramite puntatore, significa che ti 
trovi nella seconda situazione.
E.

 nulla.
Infatti.
-- 
-riko

 trovi nella seconda situazione.
Poi c'e' il caso di molto codice numerico dove gli array sono
addirittura globali.
-- 
-riko