Newsgroup: it.comp.lang.c++
Titolo: Come accedere direttamente alla memoria?????

Scusate il disturbo......e la domanda che la dice lunga sulla mia
ignoranza in materia!!!!!!!!!!!!!!!1
Come si puo' fare a leggere il contenuto di una locazione di memoria per
poi poterla visualizzare?
E per modificarla????
In pratica starei cercando l'equivalente di un POKE & PEEK di un
C64.........
Esiste una funzione standard????
Ciao a tutti e grazie anticipatamente!
Antonino

Ciao a tutti e grazie anticipatamente!
Prego, ma, tanto per ricambiare, toglimi una piccola
curiosita`; che cavolo ci fai leggendo e scrivendo
specifiche locazioni di memoria?!
Se e` per accelerare l'accesso a una qualche
cosa hardware (schermo, suono, ecc), guarda un
po' invece se il tuo sistema operativo non ti offra
soluzioni piu` furbe, come le DirectX di Win/95.
Comunque, se ci chiarisci su che sistema operi e
che scopo ti preponi con questo desiderio di
leggere e scrivere specifiche locazioni, forse ti
potremo essere piu` utili per fare quello che davvero
ti serve, che non rispondendo alla domanda cosi`
come l'hai posta!
Alex

C64.........
Forse non ho capito bene, ma se cerchi l'equivalente di peek e poke in C
puoi usare proprio le funzioni peek e poke (si chiamano sempre così).
Tuttavia è indicativo sapere dove le vuoi usare, perchè la portabilità è
ristretta a programmi scritti in codice Dos o Win16.

ristretta a programmi scritti in codice Dos o Win16.
...e ancora piu` ristretta in quanto queste funzioni non esistono su
*tutti* i compilatori per Dos o Win16 (cast e puntatori si`).
Alex

Sě, ma allora non ho capito niente! Se lui ha bisogno di scrivere
DIRETTAMENTE nella memoria, tipo immettere il valore x all'indirizzo a:b
oppure ottenere il valore presente all'indirizzo a:b, come cavolo fa con i
puntatori? Io ho *sempre* usato peek e poke!


peek e poke sono spesso macro, per scrivere all'indirizzo 0xA0000:
*((char*)0xA0000) = 7;
pero` a volte di becchi un warning.
se poi usi peek/poke solo per il fatto che in dos si usa l'indirizzamento
seg:ofs, allora : indirizzo_lineare = seg*16+ofs.
---
Ranger, togli .fr dal mio indirizzo per rispondere
http://members.tripod.com/%7Eranger_rg/

Quando mi dico che un giorno o l'altro mi dovrei leggere un bel librone sul
c...


Per accedere direttamente alla memoria basta usare una funzione
chiamata MK_FP (Make Far Pointer)
La portabilità di questa funzione è DOS e WIN16 (Win 3.11)
se per esempio vuoi mappare la cella A000:0000 basta che tu scriva in
questo modo:
#include <dos.h>
void main()
{
  char far *ptr;
  ptr = (char far *) MK_FP( 0xA000, 0x0000);
}
In questo modo hai inizializzato un puntatore che punta alla locazione
A000:0000
Per poter leggere o scrivere da questa locazione basta che tu metta
nell'assegnazione o nella lettura davanti al puntatore il carattere *
Per farti un esempio:
Vuoi leggere il valore contenuto nella locazione puntatato da ptr  e
farlo visualizzare sullo schermo:
#include <dos.h>
#include <conio.h>
void main()
{
  char far *ptr;
  ptr = (char far *) MK_FP( 0xA000, 0x0000);
  cprintf("Il valore contenuto nella locazione è %d",*ptr);
}
In questo modo si ha come risultato sullo schermo il valore contenuto
dentro la locazione!
Per modificare il valore in esso contenuto basta fare:
#include <dos.h>
#include <conio.h>
void main()
{
  char far *ptr;
  ptr = (char far *) MK_FP( 0xA000, 0x0000);
  cprintf("Il valore contenuto nella locazione è %d\n\r",*ptr);
  *ptr=100;   // Si scrive il valore 100 nella locazione di memoria
  cprintf("Il nuovo valore contenuto nella locazione è %d\n\r",*ptr);
}
Questi esempi sono stati fatti con un puntatore a "char" cioè ad 1
byte ma se tu volessi puntare ad un altro tipo di dato basta che tu
faccia un "cast" del puntatore oppure che tu lo dichiari in un altro
modo.
Per esempio:
// Puntatore a int
  int far *ptr;
  ptr = (int far *) MK_FP( 0xA000, 0x0000);
Comunque nel C (Almeno nel compilatore Borland) esistono le funzioni
PEEK e POKE per accedere alla memoria.
Comunque il metodo dei puntatori è quello più frequentemente usato nel
C
 
Spero di esserti stato di aiuto!!!!
Se hai ancora dei problemi scrivimi!
Stefano  
nep...@freemail.it