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 11-01-2013, 18:51   #1
stohuman
Bannato
 
Iscritto dal: Dec 2012
Messaggi: 41
[C - C++] Controllo 32-64 bit.

E' fattibile in C o C++ scrivere un programma che determini se il sistema sia a 32 o 64 bit (e magari l'architettura completa del processore) in modo automatico...?

Esempio banale..
Eseguibile compilato x86 32bit.. (per piu piattaforme possibili)
Codice:
if (...funzione controllo...== 32)
{
     manda in esecuzione codice compilato per 32bit...
}
else if (...funzione controllo...==64)
      {
       manda in esecuzione codice compilato per 64 bit...
      }
else
il sistema non è supportato...
Possibilmente indipendente dal sistema operativo su cui si lavora, quindi senza chiamate ma controllando direttamente l'hw.
Anche in C-ASM se solo in C o C++ non è una cosa possibile.

Ultima modifica di stohuman : 11-01-2013 alle 18:55.
stohuman è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 20:50   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
E' possibile sia a compile-time che a run-time.

A run-time è semplice: dovrebbe bastare controllare la dimensione dei puntatori.

A compile-time non è facile, perché dipende dal compilatore e della piattaforma, e quindi dai simboli che vengono esposti. Per cui devi implementare i classici controlli #if/ifdef.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2013, 02:10   #3
stohuman
Bannato
 
Iscritto dal: Dec 2012
Messaggi: 41
Si credo di aver afferrato abbastanza il concetto, i puntatori li sto studiando da un po ma non mi entrano bene.. le direttive le avevo viste giusto ieri

Proverò con le direttive del compilatore Dev.

Al massimo due cavolate che mi sono venute in mente..
fare il controllo sizeof(int), anche se significa tirarsi la zappa in bocca, e da li capire.. magari piu tardi faccio delle prove dato che ho un Vista 32bit e 7 64bit, vedo cosa salta fuori.
Seconda cavolata potrebbe essere sempre un eseguibile x86 che fa partire prima un programma a 64 bit che nel caso non funzioni ritorni un valore e faccia partire quello a 32 bit..

Go to test!
stohuman è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2013, 08:16   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Ti sconsiglio di usare il sizeof applicato a int o long. Gli int generalmente rimangono a 32 bit, mentre per i long alcuni compilatori (ABI, in realtà) li definiscono a 32 bit, e altri a 64 bit. Quindi sono inaffidabili per il problema che vuoi risolvere.

I puntatori sono ABBASTANZA (lo sottolineo, perché NON è detto che sia vero, ma non voglio dilungarmi in discorsi più complicati) affidabili da questo punto di vista, ed è quello a cui dovresti dedicarti.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2013, 11:07   #5
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Misurare la dimensione dei puntatori come ha detto cdimauro sembra la soluzione migliore (sempre tenendo in mente che non è generalmente portabile, perché di archittetture strane a questo mondo ce ne sono tante , ma se si sta su x86 o ARM non ci sono problemi).

Volevo però specificare che quella soluzione è praticamente già compile-time , perchè codice come questo:

Codice:
void func() {
  if (sizeof(void*) == 8)
    // Fai roba
  else if (sizeof(void*) == 4)
    // Fai altra roba
  else
    assert(0);
}
di fatto dal 99.9% dei compilatori C/C++ viene compilato senza branch considerando che sizeof è una espressione costante a compile-time.

Quindi cercarne altre più compilcate a compile-time non ha senso.

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 12-01-2013, 17:52   #6
stohuman
Bannato
 
Iscritto dal: Dec 2012
Messaggi: 41
Forse è meglio se mi ristudio tutte le architetture meglio... sono tante e troppe.
Grazie per il vostro tempo!
stohuman è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 13:46   #7
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Se il software è compilato a 32 bit il sizeof(void*) sarà sempre pari a 4, indipendentemente dalla versione del sistema su cui sta girando il software...

A compile time l'unica informazione che è possibile ottenere è se si sta compilando il programma a 32 o 64 bit

A runtime non esiste un modo multipiattaforma per stabilire se il sistema è a 32 o 64bit: su linux ci sono mille mila comandi che forniscono l'informazione, uno dei tanti è "getconf LONG_BIT" che restituisce 32 o 64, su Windows generalmente si cerca se esiste un metodo presente solo a 64bit ad esempio se kernel32.dll espone l'API IsWow64Process il sistema è a 64bit.

Per l'architettura del processore la cosa è più standard, su linux al solito basta parsare /proc/cpuinfo, su Windows basta chiamare GetSystemInfo
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 13:57   #8
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Se il software è compilato a 32 bit il sizeof(void*) sarà sempre pari a 4, indipendentemente dalla versione del sistema su cui sta girando il software...

A compile time l'unica informazione che è possibile ottenere è se si sta compilando il programma a 32 o 64 bit

A runtime non esiste un modo multipiattaforma per stabilire se il sistema è a 32 o 64bit: su linux ci sono mille mila comandi che forniscono l'informazione, uno dei tanti è "getconf LONG_BIT" che restituisce 32 o 64, su Windows generalmente si cerca se esiste un metodo presente solo a 64bit ad esempio se kernel32.dll espone l'API IsWow64Process il sistema è a 64bit.

Per l'architettura del processore la cosa è più standard, su linux al solito basta parsare /proc/cpuinfo, su Windows basta chiamare GetSystemInfo
Su Windows una soluzione accettabile potrebbe essere quella proposta da stohuman?

Quote:
Seconda cavolata potrebbe essere sempre un eseguibile x86 che fa partire prima un programma a 64 bit che nel caso non funzioni ritorni un valore e faccia partire quello a 32 bit..
L'unica camurrìa è che, tentando di eseguire l'applicazione a 64 bit su un sistema a 32, ti spunta la messagebox di errore. Bisognerebbe eseguire il processo in background tramite CreateProcess senza fare spuntare la message box.

Debbo provare.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 14:05   #9
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Oppure si potrebbe aprire una delle dll nella cartella di sistema ed esaminare l'header per vedere se sono a 32 o 64 bit.

Dove le trovo le specifiche dei file per Windows?
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 14:08   #10
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Se il software è compilato a 32 bit il sizeof(void*) sarà sempre pari a 4, indipendentemente dalla versione del sistema su cui sta girando il software...
Potrebbe anche essere 6.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 14:09   #11
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
Oppure si potrebbe aprire una delle dll nella cartella di sistema ed esaminare l'header per vedere se sono a 32 o 64 bit.

Dove le trovo le specifiche dei file per Windows?
http://msdn.microsoft.com/en-us/libr.../gg463119.aspx
http://msdn.microsoft.com/en-us/library/ms809762.aspx
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 14:21   #12
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Grazie

Nel frattempo avevo trovato anche questi:

http://msdn.microsoft.com/en-us/wind.../gg463119.aspx

http://msdn.microsoft.com/en-us/library/ms809762.aspx



EDIT: Ah no, il secondo link è quello tuo
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 14:30   #13
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
A questo punto, avendo le specifiche, faccio un programmino e lo posto.
Apro due o tre dll nella cartella di sistema, leggo gli header, e vedo se il formato è PE(32 bit) o PE32+(64 bit).
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 14:57   #14
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Per un mio progetto ho usato questo, che era già pronto (dislib.py).

C'è anche tanto C, se dovesse servirti.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 15:01   #15
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Voglio provare a farlo da me, c'è più soddisfazione.



Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 15:11   #16
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515


Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 15:12   #17
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
E pensare che c'è gente che è convinta che Microsoft abbia un piano diabolico per supportare soltanto gli x86 di Intel.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 15:16   #18
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da tomminno Guarda i messaggi
A runtime non esiste un modo multipiattaforma per stabilire se il sistema è a 32 o 64bit: su linux ci sono mille mila comandi che forniscono l'informazione, uno dei tanti è "getconf LONG_BIT" che restituisce 32 o 64, su Windows generalmente si cerca se esiste un metodo presente solo a 64bit ad esempio se kernel32.dll espone l'API IsWow64Process il sistema è a 64bit.

Per l'architettura del processore la cosa è più standard, su linux al solito basta parsare /proc/cpuinfo, su Windows basta chiamare GetSystemInfo
Per la fretta m'era sfuggita questa parte. Allora non c'è bisogno di leggere gli header della dll.
Comunque il programmino lo faccio lo stesso(così, for the lulz)
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 15:36   #19
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515


Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 13-01-2013, 15:52   #20
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Per Ruby si può usare pedump:

Installazione:
Codice:
gem install pedump
Vincenzo1968 è 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...
Amazon: in arrivo degli occhiali AR per ...
Un Tesla Cybertruck per le vie di Milano...
Qualcomm Quick Charge 5+: il nuovo siste...
Google Pixel Buds A-Series a prezzo mini...
Google contro le immagini fake fatte con...
Narwal Flow sbarca su Amazon: due robot ...
Bioshock: il film di Netflix si far&agra...
Samsung 'trolla' Apple su X con la campa...
Apple Watch Series 11, Ultra 3 e SE 3 gi...
Landspace: il fallimento del lancio di u...
Windows 11 25H2: Microsoft rilascia le I...
Milano, dal 15 settembre via alle multe ...
IFA 2025: BLUETTI continua a innovare co...
Un 55 pollici 4K con Fire TV a un prezzo...
TSMC avvia la produzione interna di pell...
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: 10:03.


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