|
|||||||
|
|
|
![]() |
|
|
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 19: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: 00:56.























