Newsgroup: it.comp.lang.c
Titolo: Dove Sbaglio ?

Salve a tutti , vi riporto uno spezzone di codice  che non fa il suo
lavoro :) , inoltre non riesco nemmeno a capire dov'e' l'errore .
Si tratta di un client/server che deve mandare una struct su TCP il
risultato ottenuto e 0  "\0" invece che i valori che invio.
 Ecco il codice del client
--------------------------------CLIENT------------------------------------
struct dato
{
char* buffer;
int codice;
};
main()
{ int sock;
struct dato *p, *z;
[...]
p=malloc(sizeof(struct dato));
do 
{
 p->codice=50;
 p->buffer="CIAO";
write(sock,p,sizeof(p));
}
while (1);
}
------------------------------------SERVER-------------------------------
struct dato
{
char* buffer;
int codice;
};
main()
{ 
struct dato *p;
void* p;
  p=malloc(sizeof(void)); 
do
 {   
  read(msgsock,p,sizeof(p));
  d=(struct dato *)&p;
  printf("Messaggio: %s\n",d->buff);
  printf("Messaggio %d\n",d->cod_err);
 }
while (...)
----------------------------------------------------------------------------------------
Grazie a tutti

 write(sock,p,sizeof(p));
Hai inviato il valore contenuto nel puntatore buffer e non il contenuto
dell'array da esso puntato (tra l'altro non hai neanche allocato memoria
per esso). Quindi devi scrivere
p.buffer = malloc( ... );
e poi
write(sock,p.buffer,...);
write(sock,p.codice,...);
Tieni presente che non conosco i socket e quindi queste ultime due
chiamate sono solo per darti un idea dell'errore da te commesso.
EMG

>  p->buffer="CIAO";
Cosa dovrebbe fare questa istruzione? Io non la conosco :)
Strano che il compilatore te la accetti.
Se invece era una semplificazione e nel codice hai invece usato la strcpy,
scusami.
--
Alessandro Monti

 Se invece era una semplificazione e nel codice hai invece usato la strcpy,
Per utilizzare la strcpy() però deve allocare memoria per il puntatore,
cosa che non aveva fatto nel suo esempio.
EMG

 stringa costante "CIAO".
Hai ragione, avevo guardato male e mi sembrava che volesse copiare la
stringa. Mi sono fatto confondere dal nome. :(
Comunque scherzavo, anche se fosse stato cosě, il senso era chiaro lo
stesso.
Purtroppo qualche volta il sonno fa brutti scherzi.
--
Alessandro Monti

   read(msgsock,p,sizeof(p));
volevo solo aggiungere a quello che ti e` gia stato detto, che non dovresti
usare sizeof(p) in quanto questa fornisce la dimensione "del puntatore" e non
di cio` che e` puntato da esso
cioe` se la situazione e` ad esempio l seguente:
   p
    ----------                    zona di memoria puntata da p
   |          |--------------- > -----------------------
   ----------                    |                     |
                                 |                     |
                                 |                     |
                                 |                     |
                                 |                     |
                                 ----------------------
  sizeof(p) e` diverso da sizeof(zona di memoria puntata da p).
  Ad esempio linux considera i puntatori come degli unsigned long a 4 byte,
  qundi sizeof(p) fornisce 4.
  Dovresti fare attenzione anche al caso in cui nella zona di memoria
  puntata da p ci siano altri puntatori.
  Marco Guidi.