Newsgroup: it.comp.lang.c
Titolo: Conoscere il numero di elementi in array dichiarato char **

Ciao,
dichiaro un array char **pippo che passo ad una funzione non mia che me
lo riempie.
Come faccio a sapere quanti elementi ha ?
Chiedo scusa se la domanda è stata già posta,
Colossus

 Come faccio a sapere quanti elementi ha ?
Semplice: non si puo`. La funzione probabilmente usera` qualche meccanismo
per comunicare questa informazione. Tipicamente ce ne sono due:
1) ritorna il numero di elementi;
2) inserisce come terminatore il puntatore NULL.
Nel primo caso non hai problemi. Nel secondo devi fare un ciclo fino a
che non trovi un elemento che contiene NULL. A volte le due soluzioni
si trovano accoppiate.
Saluti,
Marco
-- 
To email me, remove the no_ and _spam from my address.

Ok, la funziona ritorna a newly-allocated NULL-terminated array of
strings.
Ma non ho capito bene con cosa fare il confronto if (array[x] == NULL)
oppure if (array[x] == '\0') ??


in pratica potrebbero funzionare tutti e due,
ma la versione corretta (e piu' comprensibile) e' quella in cui fai
il controllo con NULL.
Infatti un puntatore nullo non e' un carattere uguale a zero,
ma tipicamente 4 bytes posti ad un valore (magari 0) che il
compilatore riconosce come valore del puntatore nullo.
Il carattere 0 sara' quello che termina le singole stringhe ritornate,
come e' consuetudine in C.
Quindi:
char **s;
s = allocami_della_roba();
if (s!=NULL)
  for (i=0; s[i]!=NULL; i++)
    printf("#%d = <%s>\n",i+1, s[i]);
in pratica il test lo puoi anche fare come
for (i=0; s[i]; i++)
perche' NULL corrisponde comunque ad una condizione falsa;
Il primo test
if (s!=NULL)
serve a verificare che sia stato effettivamente ritornato qualcosa.
ciao,
g.

On Wed, 1 Jun 2005, Colossus wrote:

Assolutamente la prima. La seconda, pero`, in alcune circostanze potrebbe
funzionare (essenzialmente se il "carattere" '\0' ha indice 0 nella
tabella dei caratteri).


L'ouput che mi ritona la printf è questo:
#1 = <>
#2 = <>
#3 = <>
#4 = <>
#5 = <3108>
#6 = <>
#7 = <Defl:X>
#8 = <>
#9 = <>
#10 = <>
#11 = <>
#12 = <>
#13 = <664>
#14 = <>
#15 = <79%>
La funziona che mi riempie l'array in effetti serve a dividere una
stringa secondo un delimitatore che nel mio caso è lo spazio. Nella
stringa che le passo ci sono più spazi consecutivi, ora io vorrei
stampare solo gli array che contengono qualcosa evitando il 10,11,12 e
14 per esempio. Ho provato con if (g_array[x] =="" ) if (g_array[x] ==
'\0) ma niente, cosa contiene l'array alla posizione 9,10,11  e 13 che
a video non viene stampato ??

 '\0)
 if( g_array[x][0] == '\0' ) 
M

Grazie di cuore !!!!!!!!!!! Ora funziona, mi ero dimenticato che un
array di stringhe è in realtà una matrice bidimensionale !
Colossus

 a video non viene stampato ??
Le stringhe non si confrontano con ==, ma eventualmente con strcmp()
che e' definita in string.h
Se una stringa "classica" del C e' vuota, allora non ci saranno
caratteri prima del terminatore (il carattere '\0') quindi
il test per controllare che una stringa e' lunga 0 caratteri
e'  g_array[x][0] == '\0'
ovvero vai a vedere se il primo carattere della stringa e' zero.
Alternativamente usando la strcmp questo corrisponde al test
0==strcmp(g_array[x],"")
perche' la strcmp ritorna 0 se e solo se due stringhe sono uguali.
Solo a scopo di contronto ti dico cosa facevano gli
altri tuoi controlli:
g_array[x] ==""
qui il compilatore alloca staticamente una stringa vuota ("") da qualche 
parte in memoria e poi va a controllare se il puntatore a questa stringa 
vuota ed il puntatore
alla stringa g_array[x] coincidono : impossibile!
g_array[x] == '\0'
questa controlla se il puntatore alla stringa x-esima coincide con il
valore del carattere nullo convertito in puntatore (tipicamente sara' 
0). Su certe architetture questo corrispondera' a controllare se
il puntatore e' NULL, ma non e' garantito e comunque e' sbagliato e
non e' quello che vorresti fare.
ciao,
g.