Auslesen eines Speicherbereiches
-
Hallo,
ich bin hier neu und habe bis jetzt in VBA gewerkelt.
Frage: Ich möchte bestimmte bekannte Speicherbereiche auslesen lassen. Wie bringe ich einen Zeiger dazu, in einen bestimmten Bereich zu gehen? In dem ich ihn mit der Adresse initialisiere?
Warum funktioniert das: int *pAdresse = 0xfff0; nicht???
Danke für die Geduld
mfg
ananka
-
Bei mir funzt es. Ich krieg zwar ein "Segmention fault" aber es funzt.
-
Direktes Adressieren, hmm.
Dazu müsstest du wissen ob die Adressen in C++ und im BS Relativ sind oder fest.À propos, du darfst nur in Speicherbereiche zugreifen die für dein Programm reserviert wurden!
-
@HAR:
"Bei mir funzt es." Im Ernst? Was ist denn das für ein Compiler?@Ananka:
Du must Casten, also den Typ von 0xfff0 (ein int) nach int* umwandeln.int *pAdresse = reinterpret_cast<int *>(0xfff0); // C++-Stil int *pAdresse = (int *)0xfff0; // C-Stil
Stefan.
-
ich halte es aber für bedenklich Adressen zu hardcoden!!!
-
Man wird schon wissen was man tut. Man sollte es aber wirklich wissen. Ich habe mir unter DOS damals mal eine Festplatte katuttgemacht...
-
Danke für die Antworten.
...Was ist denn das für ein Compiler?
Ein Visual Studio 6.0 Enterprise
Ich hatte die Sache mit "reinterpret_cast" falsch verstanden.
Ich will nur lesen! Nicht verändern. Ich denke doch mal, dass das nicht gleich die HDD killt?!
Gibt es vieleicht eine elegantere Methode einem Zeiger eine Adresse aufzuzwingen auf die er zu zeigen hat?
mfg
ananka
-
Hi
Mich würde interressieren wofür du das genau brauchst, vielleicht geht es ja auch anders.
Könntest du das mal posten ?
-
Wenn du auf den Bios zugreifen willst oder so...
Gefährlich, gefährlich.
Wie gesagt glaube ich, das Windows ab NT nur speicherzugriffe INNERHALB des zugestandenen Rahmens zulässt.
Alos könnten Zugriffe auf's Bios etc in die Hose gehen!
Für only reads kannst du ja nen const zeiger verwenden
const int *pointer;
int const *pointer ist auch ne möglichkeit. Das bedeutet du kannst den Zeiger nur einmal zuweisen (konstanter Zeiger)
const int * bedeutet du kannst den Wert nicht verändern (Zeiger auf konstanten Wert)
-
wenn ich nur speicher der für meinen code reserviert ist "ändern" kann... wie funktionieren dann trainer?
oder wie geht das mit smc? das codesegment wird ja normalerweise vom os abgeriegelt...
-
Mich würde interressieren wofür du das genau brauchst, vielleicht geht es ja auch anders.
Hallo zusammen.
Eigentlich ist es nur Freude am Probieren. Das alte DOS Programm "Debug" macht das auch(sogar unter XP mit NTFS von der DOS Startdisk) und da kann man in alle Segmente springen und diese auch nach belieben verändern. Ich wollte nur mal probieren, ob man das auch selber hinbekommt, nur das ich nicht schreibend zugreifen will.
Mein Plan: Ich setze einen Zeiger auf eine eingegebene HexAdresse und lasse diese dann in einer Schleife eine festzulegende Anzahl von Bits auslesen.
Gestern habe ich es fast geschafft (Zeiger auf Zeiger zum Verändern der Einsprungadresse. Da kam wieder diese Meldung: Kann <int*> nicht in <int**> konvertieren. Damit kann ich (noch) nichts anfangen. Unter VBA gibt es keine Zeiger.
Ach so: Ich bringe mir das alles aus Büchern und Vorlesungsskripten alleine bei, weil ich keinen kenne, der C++ kann. Also: 'Sorry' für stümperhaftes Programmieren.
Die Sache mit dem "reinterpret_cast" habe ich immer noch nicht kappiert. Sch....ß Bücher!#include <iostream.h> int main() { int vVariable = 5; int *pZeigerAufVariable; //Initialisieren des Zeigers: pZeigerAufVariable = &vVariable; //Nun den ganzen Käse anzeigen um mal zu sehen was passiert: cout << "Variable:\t\t\t" << vVariable << endl; cout << "Adresse der Variablen:\t\t" << &vVariable << endl; cout << "Adr. des Zeig. auf die Var.:\t" << &pZeigerAufVariable << endl; cout << "Der derefferenzierte Zeiger:\t" << *pZeigerAufVariable << endl; cout << "Noch mal die Adr. d. Var.:\t" << pZeigerAufVariable <<endl; //Jetzt will ich dem Zeiger eine Adresse aufzwingen: int vSollAdresse; cout << "Eine HexAdresse eingeben:\t" << endl; cin >> vSollAdresse; int *pZeigerAufZeiger; //Initalisierung ...und Stelle der Fehlermeldung: //error C2440: '=' : 'int ** ' kann nicht in 'int *' konvertiert werden //Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung //erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C-oder Funktionsformat pZeigerAufZeiger = vSollAdresse; //Wenn das funktionieren würde, ab hier die Schleife ......... return 0;}
P.S. Wenn ich mich zu dämlich anstelle: Bescheid sagen!
mfg
ananka[ Dieser Beitrag wurde am 28.06.2003 um 12:55 Uhr von Ananka editiert. ]