Newsgroup: it.comp.os.linux.development
Titolo: Compilare codice fatto per CPU-64bit

Salve a tutti,
ho un problemino che vorrei sottoporre all'attenzione di chi ne sa ppiù di
me....
Ho un programma scritto in "standard" C per macchine Digital a 64bit (sotto
OSF non linux), che
sto cercando di portare sotto Linux (per PC) con il minimo intervento
possibile al codice originale.
Il programma in questione deve caricare dati in formato binario da un file
creato solo su Digital (potrei trasformarlo ma non rigenerarlo da zero) il
quale è una specie di dump di strutture dati sufficientemente semplici del
tipo....
struct pippo {
    long int        uno;
    long int        due;
    time_t          tre;
    time_t          quattro;
    char             cinque;
    float            numa;
    double        checksum;
};
All'interno delle strutture non ho mai il caso della presenza di puntatori,
ma il problema grosso è che i long
sotto digital occupano 64bit cioè 8 byte contro i soli 4 byte di Linux su
PC.
La domanda nasce spontanea:
Presupponendo che nella realtà i dati memorizzati su file non contengano mai
dati (numerici) superiori a 32 bit (quindi nella realtà i Long64 sono uno
spreco inutile), come posso leggere in modo corretto i file sotto
Linux???
Altra domandina: Quancuno di voi sa se cè incopatibilità binaria tra Digital
e PC a livello binario tra interi, float e double. Nel senso swap-byte, LSB,
MSB, ecc.......????
Vi ringrazio anticipatamente per qualunque tipo di risposta,
Luca Landi

Linux???
Dove hai
	ALPHA:
		long int x;
sostituisci con:
		long int x;
		long int pad1234;
oppure (fai una prova per l'endianita')
		long int pad1234;
		long int x;
Leonardo
-- 
".signature": bad command or file name

 MSB, ecc.......????
Non credo. Comunque un programmino di test lo fai in fretta... Fai un file su
Compaq Unix con tre/quattro valori per entita` e verificalo su Linux. Putroppo
l'Alpha e` una brutta bestia e puo' essere riprogrammato facilmente.
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labor-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

 wrote in message
news:3AED2656...@cern.ch...


struttura??? 
Non lo prevedi. Lo allochi come pare a TE, e poi ti scrivi una funzione
(anzi, due) per ogni struttura:
/*
	Questa funzione prende una struttura TUASTRUCT e crea un
	blob di memoria largo w_size puntato da w_ptr contenente
	i dati come vanno esportati verso il mondo esterno.
	Ritorna EXIT_SUCCESS se tutto va bene, o EXIT_FAILURE se
	la conversione per qualche motivo non fosse possibile. E
	in quel caso, w_size contiene il codice del motivo.
*/
int host2world(size_t *w_size, void *w_ptr, TUASTRUCT *source)
{
	...
	return EXIT_SUCCESS;
}
int world2host(void *w_ptr, TUASTRUCT *destination)
{
	...
	// Uno dei mille modi di sistemare le cose...
	destination->pippo = ntohl((unsigned long *)(w_ptr)[6]);
	...
	return EXIT_SUCCESS;


 PC.
Sicuro che  un long sia a 32 bit sotto Alpha ? Comunque il gcc x86 supporta 
il tipo long long a 64 bit. Ma secondo me il vero problema sono i tipi a 
virgola mobile ( float/double ). ed anche time_t mi lascia perplesso ...
Ti consiglio di fare una programma ( sotto l'Alpha ) del tipo
read( fd, pippo, sizeof( pippo );
printf( "%ll %ll\n", uno, due ); 
[...]
In modo da ritravasare da binario ad asci e su linux fare il contrario ....