Newsgroup: it.comp.lang.c
Titolo: mi sapete dire il motivo

salve a tutti, quello che ho tentato di fare
e un piccolo programma che mi trovi
la lunghezza di stringhe che stanno nel vettore
caratteri.Tutto va bene finchè non passo ad
una funzione che contiene lo stesso codice
presente nel main.
Il compilaotr mi segnala un:
ERROR: ARITHMETIC ON POINTER
INCOMPLETE TO AN INCOMPLETE TYPE.
Cosa significa?
Grazie a tutti
char caratteri [10][11]={
 "abcdefaytn\0",
 "qwertyuiop\0",
 "ahdksnchdur\0"
/*ect*/};
/*====funzioni======*/
void ctrl(char vett[][]);
/*=======fine funzioni=======*/
void main(void)  {
int i=0;int z1,y1;
for(i=0;i<10;i++)
{if(strlen(caratteri[i])==10) z1+=1;}
printf("X!:%d\n",x1);
ctrl(caratteri); 
return;} 
void ctrl(char vett[][]){
int i=0; int cont=0;
for(i=0;i<10;i++)
{if(strlen(vett[i])==10)cont+=1;}
printf("Cont:%d\n",cont);
getkey();} 

In un attimo di smarrimento /###Lorenzo*/ disse:
Confrontalo col tuo e vedi gli errori:
#include <stdio.h>
char caratteri [3][11]={"abcdefaytn","qwertyuiop","ahdksnchdr"};
/*ho messo 11 per includere anche lo \0 finale*/
/*====funzioni======*/
void ctrl(char vett[][11]);
/*=======fine funzioni=======*/
int main(void){
  int i=0, z1=0, y1=0; /*inizializza le variabili*/
  for(i=0;i<3;i++)
    if(strlen(caratteri[i])==10) 
      z1+=1; /*controllo lunghezza+incremento contatore*/
  printf("Z!:%d\n",z1);/*stampa contatore*/
 
  ctrl(caratteri); /*richiama la variabile*/
  return 0;
}
/*se non ricordo male almeno grandezza delle colonne va specificata, CORREGGETEMI*/
void ctrl(char vett[][11]){ 
  int i=0, cont=0; /*tutto come sopra*/
  for(i=0;i<10;i++) 
    if(strlen(vett[i])==10)
      cont+=1;
  printf("Cont:%d\n",cont);
}
ciao!
-- 
By_Baitch
"Live Your Life!" (Ring ain't a jail)
http://utenti.tripod.it/baitch

 CORREGGETEMI*/ void ctrl(char vett[][11]){
Esatto. Piu' in generale solo la prima dimensione puo' non essere 
specificata: la regola per cui un array decade a puntatore non si applica 
ricorsivamente se hai un array multidimensionale.
Rif: FAQ 6.18
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 getkey();} 
getkey ?
Generalmente: il tuo stile è *pessimo*. Ho dovuto fare copy and paste in
Emacs per metterlo apposto... Può sembrare poco importante ma a mio
avviso se il codice è disordinato è molto più facile fare errori anche
banali e molto più difficile poi trovarli.
Occhio ai vari undefined behaviour.
Se vuoi un programma funzionante devi postare del codice che ha almeno
una chance di diventare funzionante, qui mancano delle funzioni (getkey
?), inizializzi variabili con un nome per poi usarne altre... insomma,
così non ci riesco proprio... :)
Ciao, auguri,
-- 
oOO()             |Nicholas Wieland|
/ _/              |nicholas_wieland|
|/ [ Step on the ]|    @
yahoo.it
   |
\_)[  right foot ]|________________|

 /*ect*/};
[CUT]
So che non rispondo propriamente alla tua domanda, ma il programma tuo
contiene cosi' tanti errori che e cose che non capisco che.....
Dai un occhio a questo programma:
<CODE>
#include<stdio.h>
#include<string.h>
char *caratteri[]={
     "first",
     "second",
     "third",
     "thisisalongstring",
     "fourth"
};
int main()
{
     int i,length;
     int size=sizeof(caratteri)/sizeof(*caratteri);
     printf("Array contiene %d stringhe!\n",size);
     for(i=0;i<size;++i){
          length=strlen(caratteri[i]);
          printf("La stringa numero %d e' di %d caratteri!\n",(i+1),length);
     }
     return 0;
}
</CODE>
char *caratteri[] puoi inizializzarlo come vuoi. Con tante stringhe quante
vuoi e della lunghezza che vuoi, anche tutte diverse!
Prova a inserire un numero diverso di stringhe e di lunghezze diverse.
L'output con tale dati e':
<CONSOLE>
Array contiene 5 stringhe!
La stringa numero 1 e' di 5 caratteri!
La stringa numero 2 e' di 6 caratteri!
La stringa numero 3 e' di 5 caratteri!
La stringa numero 4 e' di 17 caratteri!
La stringa numero 5 e' di 6 caratteri!
Press any key to continue
</CONSOLE>
Credo che questo fosse + o - quello che tu volevi fare.
Tommy


Qualche giorno fa /###Lorenzo*/ mentre mangiava il pandoro (e dopo un
interminabile thread sul \0) scrisse:
<QUOTE>
.. da quello che sò e che in C
lo \0 viene sempre aggiunto
dal compilatore quando un
char e inizializzato pippo[]="pippo";
Ciao e buone feste!
</QUOTE>
ed ora continui a mettere cose del tipo: "abcdefaytn\0" ????????????????????
Dopo tutti i threads spesi a discutere del \0  proprio poco tempo fa.......
ah, tempo perso, ah, peccato!
Tommy

ed ora continui a mettere cose del tipo: "abcdefaytn\0" ????????????????????
Dopo tutti i threads spesi a discutere del \0  proprio poco tempo fa.......
ah, tempo perso, ah, peccato!
Tommy
.. lo aggiungo a scanso di equivoci, mi sento
più tranquillo :-) , se poi anche il compilatore
lo andrà ad aggiungere , si accorgerà che e presente, 
al massimo lo sovrascrive, o cancella il mio ed aggiunge
il suo, ... che e uguale al mio :-) , per me usare il \0 dopo
aver inizializzato un vettore di caratteri e come aggiungere
il punto finale.punt\0. :-)
Ciao e grazie

getkey ?
Generalmente: il tuo stile è *pessimo*. Ho dovuto fare copy and paste in
..  cercherò di migliorare
Occhio ai vari undefined behaviour.
.. se scrivo void main (void) perche mi deve uscire :undefined
behaviour.???
Se vuoi un programma funzionante devi postare del codice che ha almeno
una chance di diventare funzionante, qui mancano delle funzioni (getkey
?), inizializzi variabili con un nome per poi usarne altre... insomma,
così non ci riesco proprio... :)
.. gli header non li ho inclusi , sorry , ma getkey(conio.h); lo conoscono anche
i sassi , ... mi e rimasta tra le righe del codice.
Comunque ho provato a passare la grandezza delle colonne con la
funzione , ma non ho risolto nulla.Il K&R non da info al riguardo, 
alla pagina 142 scrive che un vettore si passa ad un funzione(int daytab[2][13]);
oppure funx(daytab[][13]); dato che il numero delle righe e irrilevante, oppure
funz((*daytab)[13]); , ma  usare all'interno della funzione il valore
che corrisponde al numero delle colonne?, questo non lo dice.Sono
abituato a poter usare sia le righe che le colonne,  posso fare
una strlen(vett[][13])? dall'interno di una funzione?, a me da errore!
Ciao
Ciao e grazie

 Ciao
Ti rimando al programma che ti ho postato.
Credo sia una implementazione discreta di quello che vuoi ottenere.
Credo che tu ti stia perdendo...
Tommy

> /*ect*/};
la stringa "ahdksnchdur\0" occupa 12 caratteri (tra virgolette) + un ALTRO
'\0'. In pratica ha bisogno di 13 caratteri.
Come vedi il tuo array e' persino troppo piccolo e.... tu sprecavi un byte
con un \0 inutile?!?!
Tommy

 Rif: FAQ 6.18
da quale manuale hai preso questo riferimento?
c'è anche una versione sulla rete?
ciao


 c'è anche una versione sulla rete?
Dalle FAQ di comp.lang.c, di Steve Summit:
http://www.eskimo.com/~scs/C-faq/top.html


 
http://www.eskimo.com/~scs/C-faq/top.html
grazie!
