Newsgroup: it.comp.lang.c
Titolo: Parametri e puntatori

Salve.
Sono di nuovo qui e questa volta vorrei sapere cosa vuol dire questo warning
matrix_funz.c: In function ain':
matrix_funz.c:11: warning: passing arg 1 of  equest' from incompatible
pointer type
Lo ootengo compilando un programma in cui sono presenti questi frammenti di
codice ( il resto e' a posto)
void request(char **source);
...
main()
{
int a;
  char s[100];
  request(&s);
 a=s[1]-'0';         //queste due righe le ho aggiunte per controllare
  printf("%d",a);   //request
...
void request(char **source)
{
  scanf("%s",source);
}
Il programma funziona correttamente ma vorrei sapere perche' ottengo quel
messaggio.
Grazie
Vi][oZ
-- 
Per rispondere togliere NONSCASSA da reply-to.

 messaggio.
Questo è uno dei motivi per cui il C risulta ostico ai più. Il controllo dei
tipi non è così forte come si potrebbe desiderare e pertanto tanti errori
non vengono fuori o sono difficili da scoprire.
Spero di non aver detto troppe stupidate :o)
Ciao

 messaggio.
Sostituisci i char ** con semplici char *, passa alla funzione request()
semplicemente s e vedrai che tutto filerà liscio.
EMG

 wrote:
[ snip ]
CAM>s ==> espressione che vale l'indirizzo del primo carattere dell'array 
CAM>(nel contesto in cui lo usi tu
CAM>&s ==> è come se volessi prendere l'indirizzo di un indirizzo. Non credo 
CAM>che abbia molto senso.
Invece ha senso. Applicare l'operatore unario '&' al nome di un array da'
come risultato l'indirizzo dell'array (tipo 'puntatore ad un array').
E' uno dei tre (famosi ;) casi in cui il nome dell'array non decade ad un
puntatore al suo primo elemento.
In pratica, 's' e '&s' danno come risultato lo stesso indirizzo ma con un
tipo diverso.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 
OK, è giusto, solo che nel caso di una variabile del tipo "char s[100]"
(quindi con memoria già allocata) non riesco a vedere l'utilità di poter
avere l'indirizzo dell'array piuttosto che l'indirizzo del primo
carattere
Se riesci a chiarirmelo te ne sarò grato.
Ciao
-- 
- Che cosa vuol dire "addomesticare"?
- E' una cosa da molto dimenticata. Vuol dire "creare dei legami"
		Antoine de Saint-Exupéry - Il piccolo principe

 wrote:
Se sostituisco char ** con char *
quando viene chiamata la funzione mi da seg-fault
E comunque vorrei sapere xche', se non e' giusto, il mio professore di
fondamenti ha fatto un'esempio simile (chiamata di funzione ) nello spiegare
il passaggio dei parametri attuali.
P.S Oggi ho chiesto chiarimenti al riiguardo e mi ha detto che potevo
ignorare il tutto ...


 quando viene chiamata la funzione mi da seg-fault
forse perché continui a chiamare "request(&s)".
La chiamata alla funzione deve diventare:
"request(s)"


 quando viene chiamata la funzione mi da seg-fault
Hai sbagliato qualcosa. Il consiglio che ti avevo dato lo avevo prima
provato e funzionava. E comunque ti era stato dato anche da altri.
EMG

 wrote:
[ snip ]
M>Già che c'eri potevi elencare anche gli altri due :)
L'operatore unario 'sizeof' e l'inizializzazione degli array di caratteri 
mediante stringhe letterali.
[ snip ]
M>OK, è giusto, solo che nel caso di una variabile del tipo "char s[100]"
M>(quindi con memoria già allocata) non riesco a vedere l'utilità di poter
M>avere l'indirizzo dell'array piuttosto che l'indirizzo del primo
M>carattere
[bigfok@fokhouse /tmp]$ cat >prova.c
#include <stdio.h>
void stampa(void *a, void *b)
{
        printf("%p %p\n", a, b);
}
int main()
{
        char s[100];
        stampa(s, s + 1);
        stampa(&s, &s + 1);
        return 0;
}
[bigfok@fokhouse /tmp]$ gcc -o prova prova.c -Wall -ansi -pedantic
[bigfok@fokhouse /tmp]$ ./prova
0xbffffc94 0xbffffc95
0xbffffc94 0xbffffcf8
[bigfok@fokhouse /tmp]$


 [bigfok@fokhouse /tmp]$
RiOK, Arigrazie :o)
Ciao Marcello


 wrote:
Infatti, avevo sbagliato qualcosa.
Ora il programma contiene la versione propoosta qui.
Mi rimane il dubbio su suanto dettomi all'universita'...
va beh, l'importante e' aver capito :-)


ignorare il tutto ...
Be', bella spiegazione da parte sua ! ;)
Per fare l'esempio di chiamata di funzione non c'è bisogno di
complicare la vita ai tuoi allievi per far vedere quanto sei bravo,
basta scrivere :
void somma( int a, int b, int *c ) 
{
     *c = a + b ;
}
main()
{
    int c ;
    somma( 5 + 3, &c ) ;
}
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

you wrote :
Appunto;
Spero [e credo] comunque che lo faccia in buona fede.


     somma( 5 + 3, &c ) ;
Naturalmente volevi scrivere "somma(5, 3, &c)" vero? :o))
Ciao Marcello