Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-04-2005, 14: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, 14: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, 11: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, 09: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, 14: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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Dreame H15 Mix: la soluzione 7-in-1 per ...
AirPods Pro 3 in forte sconto su Amazon:...
36 offerte Amazon, molte appena partite:...
2 caricatori multipli eccezionali: da 28...
OLED e 360 Hz a un prezzo senza preceden...
Roborock Q10 S5+ a un prezzo molto conve...
Upgrade PC a prezzo ridotto: le migliori...
Sono i 6 smartphone migliori su Amazon: ...
Google Pixel 9a a 361€, mai così ...
Super sconti sugli spazzolini Oral-B, an...
Aspira a 6000Pa, lava bene, costa 139€: ...
Nuove scorte: torna il portatile tuttofa...
Toyota usa giochi e premi per spingere i...
HarmonyOS ha raggiunto la soglia di sopr...
Le offerte Amazon più convenienti...
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: 15:10.


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