Ciao a tutti!
Ho gia' chiesto su un altro forum circa questo problema, ma non ne sono venuto a capo.
Sono in ambiente Linux e sto usando la funzione
Codice:
void* shmat(int shmid, const void *shmaddr, int shmflag);
che aggancia un segmento di memoria condivisa allo spazio di indirizzi del processo chiamante, ma il discorso si puo' fare con qualsiasi funzione che ritorna un void*.
In un programma e' possibile fare questa cosa qui:
Codice:
if (shmat(<parametri>)<0)
{
...
}
else { ... }
e va tutto bene, nonostante si stia comparando un void* (il valore ritornato dalla funzione) con un int (lo zero). Inoltre il compilatore non da nessun avviso circa questo confronto. Il significato di quel codice e' di testare il valore di ritorno di shmat per vedere se c'e' stato un errore; infatti, la funzione ritorna -1 in caso di fallimento, o, in caso di successo, il puntatore al segmento di memoria agganciato.
Se pero' sono io a definire una mia funzione del tipo
Codice:
void* Funzione()
{ return -1; }
con il test
Codice:
if (Funzione()<0)
{ ... }
else { ... }
non si entra mai nel primo ramo dell' if ma sempre nell' else (perche' il valore riportato da Funzione() e' 0xFFFFFFFF, che e' maggiore di 0). Inoltre il compilatore mi avvisa che sto comparando un puntatore con un intero senza fare un cast.
Qualcuno sa spiegarmi come mai questa diversita' di comportamento tra la
shmat e
Funzione(), nonostante entrambe ritornino un void*?
Grazie,
Gica