Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-04-2005, 13:20   #1
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
[C] Puntatori void e confronti

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
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2005, 13:43   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Gica78R
Ciao a tutti!
(il valore ritornato dalla funzione) con un int (lo zero). Inoltre il compilatore non da nessun avviso circa questo confronto.
Non avvisa in quanto "0" indica anche "NULL", e un confronto tra puntatori è valido. Mettici ad es. "1" e vedrai che il warning viene generato.
Non è una buona idea però confrontare così. Io metterei if ((long)shmat(<parametri>)==-1).
Questa differenza dovrebbe spiegarti anche il punto successivo (l'if senza cast non ti funziona in quanto void * è più logicamente un "unsigned long" che un "long").
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2005, 10:35   #3
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
Quote:
Originariamente inviato da ilsensine
Non avvisa in quanto "0" indica anche "NULL", e un confronto tra puntatori è valido. Mettici ad es. "1" e vedrai che il warning viene generato.
Non è una buona idea però confrontare così. Io metterei if ((long)shmat(<parametri>)==-1).
Questa differenza dovrebbe spiegarti anche il punto successivo (l'if senza cast non ti funziona in quanto void * è più logicamente un "unsigned long" che un "long").
Boh, non riesco ancora a capire! O meglio, quello che mi hai appena spiegato l'ho capito, ma non chiarisce ancora il mio dubbio: shmat() puo' ritornare -1, e in tal caso l'espressione shmat()<0 e' vera. Se invece e' Funzione() a ritornare -1, non solo l'espressione Funzione()<0 risulta sempre falsa, ma viene anche generato il warning sul confronto tra tipi di dato differenti...
Ho dato un'occhiata ai sorgenti di shmat per vedere come e' fatta l'istruzione return, ma non ci ho capito una mazza!
Codice:
void *
shmat (shmid, shmaddr, shmflg)
     int shmid;
     const void *shmaddr;
     int shmflg;
{
  void *__unbounded result;
  void *__unbounded raddr;

#if __BOUNDED_POINTERS__
  size_t length = ~0;
  struct shmid_ds shmds;
  /* It's unfortunate that we need to make another system call to get
     the shared memory segment length...  */
  if (shmctl (shmid, IPC_STAT, &shmds) == 0)
    length = shmds.shm_segsz;
#endif

  result = (void *__unbounded) INLINE_SYSCALL (ipc, 5, IPCOP_shmat,
                                               shmid, shmflg,
                                               (long int) __ptrvalue (&raddr),
                                               __ptrvalue ((void *) shmaddr));
  if ((unsigned long) result <= -(unsigned long) SHMLBA)
    result = raddr;

  return BOUNDED_N (result, length);
}
sempre se si tratta della shmat giusta, perche' ce ne sono un paio...

Ciao
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2005, 08:45   #4
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Messaggi: 1653
Nessun' altra idea?

Gica
Gica78R è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2005, 13:32   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Gica78R
Boh, non riesco ancora a capire! O meglio, quello che mi hai appena spiegato l'ho capito, ma non chiarisce ancora il mio dubbio: shmat() puo' ritornare -1, e in tal caso l'espressione shmat()<0 e' vera
E' la documentazione che è poco chiara: shmat non ritorna un numero; in caso di errore ritorna un puntatore di valore ~0UL che, se interpretato come long, vale -1.
Nota che il confronto "<0" è sbagliato in ogni caso: puntatori validi sono ad es. 0x80ae7f00, che se interpretati come numeri con segno sono <0!
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Il parlamento francese contro TikTok: '&...
Apple Watch SE 2ª gen. Cellular a soli 2...
MotoE sospesa dopo il 2025: fine tempora...
GhostRedirector: nuova campagna di attac...
AirPods Pro 3, la nuova traduzione vocal...
Dead Island 3 potrebbe essere già...
Nuova Lancia Ypsilon Rally2 HF Integrale...
Meta e TikTok vincono la sfida legale co...
Silent Hill f: svelato il peso in GB e p...
iPhone 17, Air, 17 Pro e Pro Max: TUTTI ...
YouTube Music mette i testi delle canzon...
Dreame Aqua10 Ultra Roller scende di pre...
Revolut raggiunge i 4 milioni di clienti...
Le serie GTA e CoD dominano la classific...
James Dyson Award Italia 2025: il proget...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v