|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
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... Anche in C-ASM se solo in C o C++ non è una cosa possibile. Ultima modifica di stohuman : 11-01-2013 alle 18:55. |
![]() |
![]() |
![]() |
#2 |
Senior Member
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 |
![]() |
![]() |
![]() |
#3 |
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! |
![]() |
![]() |
![]() |
#4 |
Senior Member
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 |
![]() |
![]() |
![]() |
#5 |
Senior Member
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); } Quindi cercarne altre più compilcate a compile-time non ha senso. Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#6 |
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! ![]() |
![]() |
![]() |
![]() |
#7 |
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 |
![]() |
![]() |
![]() |
#8 | ||
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Quote:
Debbo provare. |
||
![]() |
![]() |
![]() |
#9 |
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? |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]()
__________________
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 |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#12 |
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 ![]() |
![]() |
![]() |
![]() |
#13 |
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). |
![]() |
![]() |
![]() |
#14 |
Senior Member
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 |
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Voglio provare a farlo da me, c'è più soddisfazione.
![]() ![]() ![]() |
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() ![]() |
![]() |
![]() |
![]() |
#17 |
Senior Member
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 |
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Comunque il programmino lo faccio lo stesso(così, for the lulz) ![]() |
|
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() ![]() |
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Per Ruby si può usare pedump:
Installazione: Codice:
gem install pedump ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:03.