www.mikrocontroller.net

Forum: Compiler & IDEs Variablen an bestimmten Adressen deklarieren


Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ist es möglich, in C Variablen an bestimmten Speicheradressen zu 
deklarieren?

In Pascal geht das mit "at". Gibt es etwas vergleichbares in C?

So könnte man z.B. einen Integer test1 deklarieren und einen char test2 
an der Adresse von test1 und damit automatisch auf die oberen 8 bit von 
test1 mit test2 zugreifen.

Das Beispiel ist natürlich trivial, aber man kann ja so auch 
komliziertere Strukturen zusammensetzen.

Vielleicht kennt jemand eine C-Alternative zum Pascal "at".

Gruß,

Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das C-Pendant dazu heißt union, hat allerdings nichts mit deiner
Fragestellung zu tun.

Ansonsten kann man einen beliebigen Zeiger aus einem Integer erzeugen
und über diesen auf ein Stück Speicher zugreifen.

Autor: Spinne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht über unions oder Zeiger auf Strukturen.

Bei unions an pack und in jedem Fall an endianess denken.

Autor: Spinne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hat allerdings nichts mit deiner Fragestellung zu tun

Da hat Jörg nicht recht. Du hast Dir da einen Weg ausgedacht, den man in 
C eben mit unions usw. erledigt und nicht über setzen einer festen 
Adresse.
Im allgemeinen macht man das nur in bestimmten Fällen wie Memory Mapped 
IO und andere exotische Esoteriken.

An sich würde es schon so gehen, wie Du sagst. Das wäre aber nicht 
portabel und man müsste wissen ob an der Stelle tatsächlich RAM liegt.

Daher macht man das eher über Zeiger (oder eben unions).

Autor: Spinne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sch....
Es sollte heissen: "Da hat Jörg nicht unrecht". Also: "Da hat Jörg 
recht".

Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten, das habe ich gesucht.

Wenn ich also einen integerwert in zwei char-Werte zerlegen will, 
definiere ich das etwa so:

union beide
{
  unsigned int i_zahl;
  struct {unsigned char a, b}c_zahl;
}etwas;

// Zugriff auf den integer:

etwas.i_zahl = 0xFFAA;

// Zugriff auf die untere char Variable

 if (etwas.c_zahl.a == 0xFF) //sollte true sein!?

// Zugriff auf die obere char Variable

 if (etwas.c_zahl.b == 0xAA) //sollte auch true sein


Es hängt wohl jetzt vom endianess ab, ob a und b vertauscht auf i_zahl 
gemappt werden, oder?


Ist das soweit richtig?

Viele Grüße,

Peter

Autor: Spinne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, stimmt.

Es die Zeigervariante geht so:
Struct a {int i_a;};
Struct b (char c_b1, c_b2};

char * Buffer;
Buffer = malloc (.... // oder sowas

i_temp = ((strucht a * ) Buffer)->i_a;
c_temp = ((struct b *) Buffer)->c_b1;


Das kommt Deinem ursprünglichen Ansatz schon recht nahe, aber ohne den 
Nachteil, das die Adresse vor der Laufzeit bekannt sein muss. Ausserdem 
geht das in der Regel auch auf Compilern ohne pragma pack (wie sie anno 
dunnemals) üblich waren.

Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AUch ein interessanter Ansatz, mit verschiedenen Datentypen auf einen 
vorher reservierten Adressbereich zuzugreifen. Wieder was gelernt.

Danke!

Peter

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.