Newsgroup: it.comp.lang.c
Titolo: numero di elementi di un array

dovrei conoscere il numero di elementi di un array passato ad una
funzione come puntatore e ho pensato di fare così:
num=sizeof(vect)/sizeof(vect[0])
 Il problema è che num mi ritorna sempre 1, a prescindere dalla
dimensione dell'array perchè, mi pare di aver capito, il compilatore
tratta tutti e due i parametri come puntatori allo stessi tipo e il
reltivo rapporto è chiaramente pari a 1.
Come posso risolvere?
grazie
geo

 Come posso risolvere?
Ho la sensazione che non si possa a meno di 
pastrocchi. Ma magari è possibile.
ciao!
Apx.
-- 
http://www.youtube.com/watch?v=N2ENwokc6bs&feature=related
http://www.youtube.com/watch?v=H7GBSeBffnM

 pastrocchi. Ma magari è possibile.
E' un bel casino,
passo un array dichiarato in modo dinamico ad una funzione che lo
riempe con valori. Alla fine l'array ha il significato di un insieme
ed io devo conoscere la cardinalità dell'array/insieme.
Spero che qualcuno possa darmi qualche indicazione
grazie comunque

 darmi qualche indicazione
Ma a questa funzione non puoi passare altri
parametri da passare a sua volta alla funzione che
fa il conteggio? Con un puntatore a intero
risolveresti tutto. Alla funzione che riempie
l'array passi pure il puntatore (eventualmente a una
struttura se ti servono altri dati) e alla funzione
che fa il conteggio passi l'intero stesso o di nuovo
il puntatore alla struttura se hai usato questa
soluzione.


On 14 Apr, 21:48, Archaeopteryx

Ci provo,
ma il problema è che la funzione che "riempie" in realtà opera una
successiva elaborazione sull'array che, al verificarsi di una serie di
condizioni, pone a zero alcune posizione dell'array. La funzione che
conta deve avere il numero totale dell'array per scandirlo tutto e
verificare quale posizioni sono diverse da zero. Inoltre c'è un
problema che nossuno può aiutarmi a risovere: sono abbastanza rospo in
C.
Ciao

 geo
usa una lista invece di un array, oppure passi pure la dimensione, bene 
o male quando allochi la dimensiona la sai no?

 aiutarmi a risovere: sono abbastanza rospo in C.
si fa abbastanza facilmente. Nell'ipotesi che il tuo
array sia di interi avrai uno pseudocodice tipo
questo. Non ho controllato né l'ho fatto girare, ma
dovrebbe dare un'idea. Ovviamente te lo adatterai al
tuo problema, aggiungi gestione errori, etc.
ciao
Apx.
void  insert (int *array, int dim, int pos, int value)
{
    if( pos >= dim )
      errore ("indice fuori limite") ;
   array [pos] = value ;
   /* qui i tuoi altri calcoli successivi su 'array' */
}
int  get_size (int *array, int dim)
{
   int   counter ;
   /* trova il primo elemento diverso da zero dalla
    * fine
    */
   for( counter = (dim-1) ; counter >= 0 ; counter-- )
   {
     if(  array[counter] != 0  )
       break ;
   }
   return (counter) ;
}
int main ()
{
   int    *array = malloc int [120] ;
   int     counter, logical_size ;
   for( counter = 0 ; counter < 120 ; counter++ )
     *(array+counter) = 0 ;
   /* inserisci il valore 4 nella posizione 88 */
   insert (array,120,88,4) ;
   /* trova la dimensione:
   logical_size = get_size (array,120) ;


Ok!
grazie degli aiuti,
facci le prove e se non riesco... rompo di nuovo.
geo


sizeof(vect) da un risultato valido solo se la dimensione del vettore 
è conosciuta a compile time.  Cioè se dichiari:
char vect[1000];
allora
num = sizeof(vect) / sizeof(vect[0]);
ritornerà correttamente la dimensione del vettore.  Se il vettore è 
allocato dinamicamente a run time il compilatore non può risolvere.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >