Newsgroup: it.comp.lang.c++
Titolo: memoria

Salve... sto realizzando un programmino che gestisce la memoria video e
tanto cosine annesse.
Il problema è ke se voglio colorare tutto lo schermo con un unico colore,
riesco benissimo a farlo con il seguente codice:
____________________________________
....
unsigned char far *p;
....
// Punto alla memoria grafica
p=(unsigned char far*)0xA0000000;
for (i=0; i<64000; i++)   // 64000 = 320*200 bytes
{ *p=(colore);
   p++;
};
____________________________________
A questo punto se eseguo tale funzione lo schermo si colora interamente del
colore che io dico.
Ovviamente prima di tutto ciò sono passato alla modalità grafica 13H
(320x200x256).
Il problema sorge quando voglio colorare lo schermo con la funzione memset,
così strutturata:
void *memset(void *s, int c, size_t n);
che, "a quanto dice l'help", serve per settare gli n bytes della zona di
memoria puntata da s con il valore indicato nel carattere c (e mi kiedo come
mai nella funzione tale variabile sia dichiarata come int...).
Se provo a usare la funzione memset sorgono alcuni problemi:
____________________________________
....
unsigned char far *p;
....
// Punto alla memoria grafica
p=(unsigned char far*)0xA0000000;
memset(p, colore, 64000);            // L'errore è qui, ovviamente
____________________________________
Così facendo mi dà errore perchè dice che p è di tipo unsigned char far*
mentre è richiesto un tipo void*;
ok, allora cambio il codice in:
____________________________________
....
unsigned char far *p;
....
// Punto alla memoria grafica
p=(unsigned char far*)0xA0000000;
memset((void *)p, colore, 64000);
____________________________________
Ma così non succede nulla. Lo schermo non cambia affatto colore, anzi a
volte mi dà problemi... eppure usando quel codice per gestire dei vettori
puntati da puntatori far le cose andavano bene:
____________________________________
....
unsigned char far *p;
unsigned char v1[10]
int i;
// Punto al vettore
p=(unsigned char far*)&v1[0];
// Setto 10 bytes col valore 3 partendo dall'indirizzo puntato da p
memset((void *)p, 3, 10);
for (i=0; i<10; i++)
 cout<<v1[i]<<"\n";
____________________________________
E, testando questo codice, effettivamente il vettore v è stato riempito di
valori 3.
Come mai con la memoria video, puntata sempre da un puntatore di tipo char
far*, non accade la stessa cosa???

 far*, non accade la stessa cosa???
Se punti alla memoria video con un "char far*" funziona. Se punto con un "char*"
non funziona. Idem se sostituisci void a char.
Infine nota: "far" non esiste ne in C ne in C++. E una estensione obsoleta di
alcuni compilatori C in ambiente DOS.
Per ulteriori domande rivolgiti ad un gruppo che parla di DOS.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 news:mkpr7.30468$P04.2...@news2.tin.it...
Vabbè insomma parlare di istruzioni che gestiscano la memoria è compito di
questo NG no?
Se la funzione memset è dichiarata in questo modo:
void *memset(void   *s, int    c, size_t   n);
io per settare la zona di memoria puntata da
char far *p=(indirizzo da gestire)
come devo fare? Come passo p?
Grazie ancora....
--
______________________________________
Saluti dal Grande VEGETA PRINCIPE DEI SAIYAN
Il Millenium Bug ora si chiama WindowsME.... =(

 come devo fare? Come passo p?
Semplicemente non puoi. La memset dichirata in quel modo non puo' scrivere negli
indirizzi alti.
Siamo OT in questo NG.
Se proprio vuoi usare memset devi come minimo cambiare modello di memoria (il
che cambia la dichiarazione della memset). Ma questa e' una cosa completamente
system dependent, che non ha a che fare ne con il C ne con il C++.
