Newsgroup: it.comp.lang.c++
Titolo: Piccolo aiuto per una cosa per voi molto banale

typedef unsigned char BYTE;
BYTE *switches = (BYTE *) 0xE001;
BYTE *leds = (BYTE *) 0xE003;
Sono un pochino arrugginito(e da qualche anno che non tocco nulla di 
programmazione), mi aiutate a capirla?
Nella prima riga creiamo il tipo BYTE
Nella seconda(e terza) creiamo due variabili puntatore ad un tipo BYTE(e 
cioe a un tipo carattere).
Qual'è il significato dell'operazione dopo l'uguale?
Grazie a tutti.

 Grazie a tutti.
Ad essere piů precisi, non capisco cosa significa (BYTE *) in 
quell'espressione.
Alla fine quali sono gli indirizzi finali ai quali i due puntatori si 
riferiscono?
In questo caso dovrebbero essere proprio 0xE001 e 0xE003 ma perchč non 
scrivere ad esempio: BYTE *switches = 0xE001; ?

 scrivere ad esempio: BYTE *switches = 0xE001; ?
No, non  è concesso, devi esplicitare le tue intenzioni dicendogli che 
vuoi proprio convertire una costante numerica in un puntatore.
Se devi modificare quel codice, puoi prendere in considerazione l'idea 
di sostituire il cast in stile C con reinterpret_cast, se invece devi 
solo capire come funziona e interfacciarti con quel codice puoi anche 
lasciarlo come sta.
-- 
  FSC - 
http://userscripts.org/scripts/show/59948
 
http://fscode.altervista.org
 - 
http://sardinias.com

 In questo caso dovrebbero essere proprio 0xE001 e 0xE003 ma perchè non


 alla memoria fisica.
No.
In generale il formato del contenuto del tipo puntatore e' definito solo 
dalle regole di interfacciamento del OS con l' hardware.
In alcuni hardware dotati di MMU, per esempio, l' indirizzamento 
associato al task parte da un address=0 a cui viene sommato il vero 
indirizzo (reale o virtuale) di inizio del segmento dati (o altro) che 
interessa direttamente dall' hardware MMU.
In altre architetture il contenuto del puntatore puo' essere misto 
(tag+offset, dove tag e' una entrata di tabella che contiene il vero 
address).
Per l' X86 nin'zo.

 lasciarlo come sta.
Devo solo capirlo, per fortuna ;-)
Grazie a te e a Mario.

 mapped) da gestire in questo ambiente:
Precisamente queste sono le due semplici periferiche virtuali(come 
vedete gli indirizzi son quelli):
Switches
This input device consists of a row of 8 toggle switches numbered 0 to 7 
and correspond to 8 bits with the same number of memory location $E001. 
Alternatively, the switches can be read as a 16-bit word from location 
$E000, however the highest 8 bits are undefined in this word. These 
locations cannot be written to.
A switch can be toggled by clicking the left mousebutton on the desired 
switch. A switch is ON if the red LED in the switch is illuminated, this 
results to a logical ‘1’ in the corresponding bit position of memory 
location $E001.
No keyboard interface is provided to this I/O device, although, once 
selected by clicking the mouse, a switch can be toggled with the space bar.
LED’s
This output device consists of a row of 8 LED’s numbered 0 to 7 and 
correspond to 8 bits with the same number of memory location $E003. 
Writing a logical ‘1’ to any bit in this location turns the 
corresponding LED on. Alternatively, the LED’s can be written as a 
16-bit word to location $E002, however the highest 8 bits are ignored.

 Esatto?
Non esattamente, o meglio: incompleto, dato che la storia non finisce 
qui. Quello che vediamo qui è solo un utilizzo particolare del cast in 
stile C: il comando in generale significa "interpreta ciò che si trova 
dopo le parentesi come se avesse il tipo indicato tra le parentesi" - si 
tratta a tutti gli effetti di una forzatura (spesso necessaria) nei 
confronti del compilatore - in particolare del suo controllo sulla 
compatibilità dei tipi.


 compatibilità dei tipi.
Piccolo chiarimento: la forzatura è "spesso necessaria" in C, non in 
C++. In C++ cambiano un sacco di cose e la necessità di forzature è 
decisamente inferiore se non addirittura inesistente.


 nativo o dentro DOS BOX.
Virtual 8086 mode. Tutti i programmi DOS da Win2000 in poi (ma pure da 
win98, credo) venivano e vengono eseguiti in una macchina virtuale 16bit 
a parte, il che rende molto facile fare proprio quello che ipotizzi tu. 
Anche se, onestamente, non ne so granché più di così...

 address).
ok, questo però a livello di OS/HW ... o intendi che già il 
compilatore se ne occupa ? Imho lui può sapere solo l'offset 
relativo.
ciao
Soviet


 codice entro il segmento codice).
Nel mio caso, e' un meccanismo molto piu' complesso: viene creato un 
ambiente di indirizzamento virtuale nel quale il task (il gruppo di 
task) non interagisce direttamente con l' ambiente esterno (altri task e 
OS).
Se il task cerca di uscire dallo spazio assegnato, viene immediatamente 
fermato (o generata una eccezione).
Ovviamente, a differenza di (
p.es
.) dei vari dialetti Unix, l' OS e' a 
sua volta un (gruppo di) task che gira in modo indipendente.


it.comp.lang.c ?

 it.comp.lang.c ?
Hai ragione, ho scoperto l'esistenza del ng solo dopo aver mandato il 
messaggio qui.
-- 
Bonus di 25 euro su 
betfair.it
, codice da inserire: AAAACGWFG
Vai sul mio sito(in fondo alla pagina) per altri dettagli:
http://digilander.libero.it/maxxam99/