Forum: Compiler & IDEs Bestimmte Speicheradresse mit C schreiben/lesen


von M. I. (Gast)


Lesenswert?

Hallo,

ich werde wohl bald vor der Aufgabe stehen, in einem C-Programm eine 
bestimmte Speicheradresse lesen bzw. beschreiben zu müssen. Gibt es da 
eine Möglichkeit, einen Speicherbereich mit seiner Hex-Adresse 
anzusprechen, also quasi am Compiler/Linker vorbei? Oder muss ich auf 
Assembler zurückgreifen?

Hintergrund ist, dass an dieser Stelle eine FPGA-Regelung einen Wert 
ablegt.

von Oliver (Gast)


Lesenswert?

Generell geht das seit anno 62 in C:

int *adresse = 0x1234;
int wert = *adresse;

Aber ob das auf deinem Mikro auch so ist, sagt mir meine Kristallkugel 
nicht.

Oliver

von mihawk (Gast)


Lesenswert?

oliver:
Das hängt eher von seinem Compiler ab als von seinem "Mikro".
Aber meine Kristallkugel sagt mit 99,9 prozentiger Wahrscheinlichkeit 
sollte das klappen ;)

von M. I. (Gast)


Lesenswert?

Was bewirkt denn der Code?

int *adresse = 0x1234;
int wert = *adresse;

In wert steht dann der Inhalt von 0x1234?

von nischu (Gast)


Lesenswert?

Exakt.

von mork (Gast)


Lesenswert?

Hallo, es geht auch ohne Zwischenvariable:

Var=(*((volatile int *) adresse));
(*((volatile int *) adresse))=Var;

MfG Mark

von Don Martin (Gast)


Lesenswert?

int *adresse = 0x1234;

bewirkt beim GCC:

"warning: initialization makes pointer from integer without a cast"

wie macht ihr den cast denn?

von mork (Gast)


Lesenswert?

>wie macht ihr den cast denn?

In C:
int *adresse = (int*) (0x1234);

In C++:
int *adresse = reinterpret_cast<int*>(0x1234);

MfG Mark

von M. I. (Gast)


Lesenswert?

Warum einmal volatile int bei der direkten Variante, und bei der 
indirekten ohne volatile?

von Oliver (Gast)


Lesenswert?

Weil ich das volatile da vergessen habe :-)

Oliver

von Sap (Gast)


Lesenswert?

Hallo alle zusammen,
Ich hab schon viele Forume durchgesucht aber nix gefunden über 
Speicheradressen lesen in C#, und hier hab ich was gefunden aber halt in 
C wie man die Speicheradresse lesen kann, nun ist die frage ob man das 
auch in C# so benutzen kann.
Ich würde mich freuen wenn mir jemand sagen könnte wie man das machen 
könnte in C#.
Ich finde das Forum hier auch bis jetzt das Beste wo ich gefunden habe, 
hat sehr viele nütztliche Post's. Und es gibt hier viele Leute wo echt 
viel ahnung haben von ihrem Fach, das freut mich besonders.
Werde das so testen wie es hier weiter oben beschrieben ist:
int *adresse = 0x1234;
int wert = *adresse;
Ob es in C# geht.
Liebe grüsse von Sap

von Karl H. (kbuchegg)


Lesenswert?

Sap wrote:
> Hallo alle zusammen,
> Ich hab schon viele Forume durchgesucht aber nix gefunden über
> Speicheradressen lesen in C#,

http://www.google.com

Suchbegriff: "C# pointer"

-> 
http://www.c-sharpcorner.com/UploadFile/rajeshvs/PointersInCSharp11112005051624AM/PointersInCSharp.aspx

von Sap (Gast)


Lesenswert?

Danke Karl für die schnelle antwort.
Hab nun raus wie ich Speicheradresse lesen kann in C#.
Hier was ich getestet habe, vielleicht kann es ja dann später irgend wem 
helfen:
            unsafe
            {
                 // *i ist der Valor von der Speicheradresse
                 //  i ist die Speicheradresse

                int y = 7; // Speicheradresse ist: 69133040
                int x = 4; // Speicheradresse ist: 69133036
                int *i = (int*)69133036;
               // int* i = &x; zum sehn welche Speicheradresse x hat
                int aux = (int)*i; // ergebnis wäre 4
               // int aux = (int)i; // ergebnis wäre Speicheradresse
                MessageBox.Show(aux.ToString());
            }
Die Speicheradresse kann verschieden sein bei jedem.

von P. O. (neop13)


Lesenswert?

entweder verstehe ich das falsch, oder die antworten sind alle nicht auf 
die überschrifft bezogen

er fragt ja auch, wie er einen wert an eine bestimmte Adresse schreiben 
kann.

Würde mich nämlich auch interessieren, wie das geht ;-)
MfG Patrick

von Karl H. (kbuchegg)


Lesenswert?

Patrick S. schrieb:
> entweder verstehe ich das falsch, oder die antworten sind alle nicht auf
> die überschrifft bezogen

Du verstehst das dann falsch. Bis auf die letzten 3 (die das ganez unter 
C# behandeln) sind alle Antworten 'on topic'

> er fragt ja auch, wie er einen wert an eine bestimmte Adresse schreiben
> kann.
>
> Würde mich nämlich auch interessieren, wie das geht ;-)

Du nimmst die Adresse als Zahl, castest sie in einen Pointer um und 
greifst über den Pointer zu.

von Bash_s (Gast)


Lesenswert?

Hallo zusammen,

bei mir funktioniert folgendes:

int *iAddress = reinterpret_cast<int*>(0x1234);

aber mit float funktioniert es nicht:

float *fAddress = reinterpret_cast<float*>(0x1234);

Hat jemand eine idee?

von Klaus W. (mfgkw)


Lesenswert?

Was heißt "funktioniert nicht"?

Was heißt "hier"?
(Bitte keine Antworten in der Art "in Düsseldorf", sondern eher auf 
welchem System, Prozessor, Betriebssystem, Compiler, ...)

von Bash_s (Gast)


Lesenswert?

Danke für die Antwort!

Error ist folgender: Invalid Cast from type 'float' to type 'float*',


programmiert hab ich es mit dem QT Creator , compiler: mingw, 
Betriebssystem: Windows XP

von Karl H. (kbuchegg)


Lesenswert?

Bash_s schrieb:
> Danke für die Antwort!
>
> Error ist folgender: Invalid Cast from type 'float' to type 'float*',
                                               *****           ******

Irgendwo hast du in deinem richtigen Code den Pointer-* vergessen.

von Bash_s (Gast)


Lesenswert?

Ok, was ich geschrieben hab stimmt so nicht, die von mir oben genannten 
beispiele funktionieren, den fehler bekomme ich nur bei folgender Zeile:

float *fAddress = reinterpret_cast<float*>(sAddress.toFloat());

int *iAddress = reinterpret_cast<int*>(sAddress.toInt()); <-- wird 
richtig compiliert

sAddress ist ein QString.

von Nico S. (nico22)


Lesenswert?

Sicher, dass .toFloat() einen float* zurückgibt und keinen float?

von Karl H. (kbuchegg)


Lesenswert?

Bash_s schrieb:
> Ok, was ich geschrieben hab stimmt so nicht, die von mir oben genannten
> beispiele funktionieren, den fehler bekomme ich nur bei folgender Zeile:
>
> float *fAddress = reinterpret_cast<float*>(sAddress.toFloat());

toFloat() liefert einen float?


Na ja, was erwartest du, wie soll man aus einem Float (warum eigentlicgh 
float?) eine Adresse machen?  Welches ist denn das 2.5 te Byte?

Ich denke du machst einen Fehler. Im Speicher liegt an dieser Adresse 
ein float. Aber deswegen ist ja die Adresse selber kein float! Eine 
Adresse ist immer eine ganze Zahl. Du musst unterscheiden zwischen der 
Adresse selber und dem was unter dieser Adresse im Speicher zu finden 
ist. Das eine hat mit dem anderen insofern nix zu tun, als eine Adresse 
einfach nur eine ganze Zahl ist. Wenn ich dann diese Zahl hernehme und 
mir die Bytes von dieser Speicheradresse hole, dann kann ich mit diesen 
Bytes einen float bilden. Aber deswegen ist ja eine Adresse kein float.

von Bash_s (Gast)


Lesenswert?

Das stimmt natürlich, danke für den Hinweis!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.