Newsgroup: it.comp.lang.c++
Titolo: void*' is not a pointer-to-object type

Ciao,
se sono OT chiedo scusa. Come faccio a passare
un puntatore ad una intera struttura in questo codice
senza ottenere l'errore in oggetto ?
struct my_structure
{
        QWidget *pThis;
        int accepted_socket;
        struct accept_addr;
}       *str_Pointer = NULL;
.............
pthread_create( &Client_Thread, NULL, Mizio_Client, (void*)str_Pointer);
.............
 void* Mizio_Client ( void* socket )
{
        char buffer[255];
        while ( read( socket->accepted_socket, buffer,255 ) > 0)  // Qui ho
l'errore
        {
        printf ("%s",buffer);
        }
        printf ("Connection closed\n");
        close( (int)socket );
    pthread_exit( NULL );
}
Grazie mille per l'aiuto
-- 
Bye,
Colossus

         while ( read( socket->accepted_socket, buffer,255 ) > 0)  // Qui
ho
Max

>         char buffer[255];
mizio.cpp:129: `my_structure' undeclared (first use this function) 
* mizio.cpp:129: (Each undeclared identifier is reported only once for each  
*  function it appears in.) 
* mizio.cpp:129: parse error before `*' token 
* mizio.cpp:132: request for member `accepted_socket' in `socket(int, int,
int)', which is of non-aggregate type `int ()(int, int, int)'
Ehm, la struttura my_structure è dichiarata in un'altra funzione,
Mizio_Server e non Mizio_Client.
-- 
Bye,
Colossus

 Mizio_Server e non Mizio_Client.
Bene. Mi pare che tu sia sulla buona strada per risolvere il problema.
(Oggi mi sento maieutico.)
Max

Max M wrote:

La maieutica non c'entra col quesito che ho posto, sarebbe stato più cortese
per te non rispondere affatto. 
-- 
Bye,
Colossus

 cortese per te non rispondere affatto.
Se 'Mizio_Client' deve accedere a un membro di 'my_structure' deve avere 
visibilità sulla sua dichiarazione. A questo mi pare ci fossi arrivato da 
solo. Ora, non potresti spostare la dichiarazione di 'my_structure' in un 
punto in cui sia visibile anche da 'Mizio_Client' (un file header 
condiviso, ad esempio)?
Max

 condiviso, ad esempio)?
L'ho fatto infatti ma in fase di linking il linker mi dice:
'multiple definition here' e 'first defined here' nel file main.o
e mizio.o
Ti ringrazio comunque del tempo che hai speso per rispondermi.
-- 
Bye,
Colossus

 wrote...

Ok, mi spiace che ti abbia infastidito l'approccio maieutico. :-)
Venendo al tuo problema. Non ho tutti gli elementi per identificarlo con
precisione, ma posso fare due considerazioni che ti saranno di aiuto.
L'errore che riporti parla di "definizioni", mentre il mio suggerimento
parlava di "dichiarazioni". Ora, in ogni un'unità di compilazione (il
processo che produce un file .o, per intenderci) ogni entità può essere
*dichiarata* una sola volta, ma la stessa *dichiarazione* può comparire in
qualsiasi altra unità di compilazione. Una *definizione*, invece, deve
comparire una ed una sola volta in assoluto, quindi in *una sola* unità di
compilazione.
Se l'errore di 'multiple definition' riguarda una *istanza* di
'my_structure', la mia ipotesi che tu abbia collocato la definizione di una
variabile di tipo 'my_structure' in un header che viene #incluso in più
unità di compilazione. In questo caso, la soluzione è spostare tale
definizione altrove.
Per chiarire la terminologia:
  struct my_structure { ... };
         // questa è la dichiarazione di un tipo
  my_structure var;
    // questa è la definizione di una variabile
    // (ed è implicitamente anche una dichiarazione)
 extern my_structure var;
    // questa è la dichiarazione di una variabile, ma
    // *non* è una definizione
Max

 definizione altrove.
Ok, ti ringrazio. Ho risolto il problema del linker ma ne ho uno nuovo
in fase di compilazione:
mizio.cpp:121: warning: invalid conversion from `void*' to `my_structure*'
 void* Mizio_Client ( void *dummy_pointer )
{
121:    my_structure *dummy_str = dummy_pointer;
        char HTTP_Headers[255];
        //printf ("New connection from %s on socket %d\n",
inet_ntoa(accept_addr.sin_addr), socket);
        while ( read( dummy_str->accepted_socket, HTTP_Headers,255 ) > 0)
        {
                printf ("%s",HTTP_Headers);
        }
        printf ("Connection closed\n");
        close( dummy_str->accepted_socket );
    pthread_exit( NULL );
}
Questa funzione la chiamo con:
pthread_create ( &Client_Thread, NULL, Mizio_Client, &str_Pointer);
Mentre le definizioni sono:
#ifndef _MY_STRUCT_H_
#define _MY_STRUCT_H_
struct sockaddr_in port_addr;
struct sockaddr_in accept_addr;
struct my_structure
        {
                Mizio *pThis;
                int accepted_socket;
                struct accept_addr;
        }       *str_Pointer = NULL;
void* Mizio_Server ( void *dummy);
void* Mizio_Client ( void *dummy_pointer );
#endif
Saresti così gentile da dipanarmi questa matassa ?
Se vuoi ti dico cosa sto cercando di realizzare.
-- 
Bye,
Colossus

 Se vuoi ti dico cosa sto cercando di realizzare.
Ok, ho usato lo static_cast che mi hai suggerito ieri e non ho
errori nella compilazione ma il programma crasha quando esegue
la funzione pthread_create con il puntatore alla struttura sigh ! Sono
disperato sigh sigh ! Hai mica Linux ? Ti spedirei il programma se sei
daccordo.
-- 
Bye,
Colossus

 daccordo.
Ok, spedisci pure, ma non garantisco sui tempi di feedback.
La cosa comunque è diventata OT in questo NG (se non lo era dal principio).
Trattandosi di un problema, presumibilmente, legato al mulithreading e
all'uso delle API POSIX (pthread), la questione non riguarda strettamente il
C++, né può essere affrontata con il solo ausilio di un manuale del C++. Ti
serve un manuale o un tutorial che ti spieghi come realizzare applicazioni
multithread. Suggerisco, tra le varie cose, una lettura delle FAQ di
comp.programming.threads (GIYF!).
Max

Veramente per problemi cosě specifici non me la sentirei di darti
spiegazioni ma solo consigli,
segui passo passo le operazioni che susseguono durante la chiamata
alla funzione,
MVC++ te lo consente con F9, non so se compili con quello,
a me č successo piů volte un problema di casting, vedi se puň essere,
non dare mai per scontato niente, nelle mani del compilatore decide
lui, le configurazioni sono diverse per ognuno,
my_structure *dummy_str;
dummy_str = (my_structure*)dummy_pointer;