mikrocontroller.net

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


Autor: M. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mihawk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: M. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bewirkt denn der Code?

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

In wert steht dann der Inhalt von 0x1234?

Autor: nischu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Exakt.

Autor: mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, es geht auch ohne Zwischenvariable:

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

MfG Mark

Autor: Don Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int *adresse = 0x1234;

bewirkt beim GCC:

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

wie macht ihr den cast denn?

Autor: mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wie macht ihr den cast denn?

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

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

MfG Mark

Autor: M. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum einmal volatile int bei der direkten Variante, und bei der 
indirekten ohne volatile?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ich das volatile da vergessen habe :-)

Oliver

Autor: Sap (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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/P...

Autor: Sap (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. Ostrich (neop13)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bash_s (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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, ...)

Autor: Bash_s (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bash_s (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nico Sch. (nico22)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bash_s (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das stimmt natürlich, danke für den Hinweis!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.