[gelöst] Variablen "überlagern" in C bzw. C++

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
TuxPeter
Beiträge: 2016
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

[gelöst] Variablen "überlagern" in C bzw. C++

Beitrag von TuxPeter » 14.12.2020 11:58:54

Hallo Debianfreunde,

Vor einiger Zeit bin ich auf den "Arduino" gestoßen, und den programmiert man leichtesten mit der Arduino-IDE in C bzw C++.
Um C hatte ich, ebenso wie um die sog. Objektorientierung, bislang einen großen Bogen gemacht. Immerhin stolpere ich jetzt nicht mehr in jeder Anweisung über die C-Syntax, aber:
Vermutlich habe ich Klöße auf den Augen, und finde etwas nicht, was ich in meiner umfangreichen Pascal-Programmiererei gerne angewendet habe:

Code: Alles auswählen

var arr : array [0 ..20] of byte;
  var x : double absolute arr [4];
Das Beispiel mag jetzt nicht besonders sinnvoll sein außer man will den Aufbau einer double untersuchen, aber ich hoffe, man versteht, was ich meine.
Jedenfalls kann das viel Schreiberei mit Retyping, expliziten und impliziten Type-Cast usw. sparen.
(Ich habe es in Arduino-C zwar geschafft, mittels Pointer bewusst über Arraygrenzen zu gehen, aber die blöden Variablen werden anscheinend weder auf- noch absteigend im Speicher abgelegt, hinzu kommt, dass man im Arduino nicht debuggen kann - ist schon ein bisschen spartanisch, das Ganze)

Könnt ihr mir evtl. einen kleinen Tipp geben, wie ich das in C erreiche?

Grüße, TuxPeter
Zuletzt geändert von TuxPeter am 14.12.2020 16:45:47, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Variablen "überlagern" in C bzw. C++

Beitrag von Meillo » 14.12.2020 12:25:36

TuxPeter hat geschrieben: ↑ zum Beitrag ↑
14.12.2020 11:58:54
Vermutlich habe ich Klöße auf den Augen, und finde etwas nicht, was ich in meiner umfangreichen Pascal-Programmiererei gerne angewendet habe:

Code: Alles auswählen

var arr : array [0 ..20] of byte;
  var x : double absolute arr [4];
Mir zumindest musst du erst mal erklaeren, was das inhaltlich eigentlich bedeutet. ;-)
Das Beispiel mag jetzt nicht besonders sinnvoll sein außer man will den Aufbau einer double untersuchen, aber ich hoffe, man versteht, was ich meine.
Jedenfalls kann das viel Schreiberei mit Retyping, expliziten und impliziten Type-Cast usw. sparen.
Hoert sich irgendwie wie Unions an. Hier findest du ein Beispiel:
viewtopic.php?f=15&t=172060&p=1196598#p1196598

Code: Alles auswählen

union {
	float f;
	char s[4];
} u;
Beachte bitte, dass die Groessen der Datentypen in C nicht garantiert sind. Float darf IIRC auch 8 Bytes lang und damit nur ein Alias fuer `double' sein.


(Ich habe es in Arduino-C zwar geschafft, mittels Pointer bewusst über Arraygrenzen zu gehen, aber die blöden Variablen werden anscheinend weder auf- noch absteigend im Speicher abgelegt, hinzu kommt, dass man im Arduino nicht debuggen kann - ist schon ein bisschen spartanisch, das Ganze)
Hohoho, da treibt aber jemand wilde Spielereien! Du solltest schon genau wissen, was du im Speicher so machst, wenn du willkuerlich auf irgendwelche Adressen zugreifst, oder versuchst zu raten, wo und wie irgendwelche Variablen abgelegt werden.


Vielleicht erklaerst du mal was genau du eigentlich tun willst ... falls es nicht nur um akademische Spielereien geht.
Use ed once in a while!

TuxPeter
Beiträge: 2016
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: Variablen "überlagern" in C bzw. C++

Beitrag von TuxPeter » 14.12.2020 12:52:13

Danke für die Antwort!

Liegen denn in der "Union" Deines Besipiels die beiden Variablen "Übereinander", d. h. belegen den gleichen phys. Speicher? (Gut, das könnte ich schnell ertesten) Dann habe ich doch schon, was ich will!
Bin zwar bei meinen "Forschungen" auch über den Begriff "Union" gestolpert, nicht weiter geschaut, dachte, das seinen einfach nur Records.

Was ich eigentlich will? Ich muss mit jedem Byte geizen im Arduino Nano, und wenn ich da durch geschicktes Speicherdesign usw. ein paar Adressier-Schritte oder anderweitig Bytes zur Laufzeit spare, dann kann das nur gut sein!

Grüße, TuxPeter

Habs jetzt mal getestet, sieht aber aus wie voll die Spielerei:

Code: Alles auswählen

void setup() {
  Serial.begin (9600);
}

union {
  unsigned int a[4] = {3, 256, 255, 5};
  byte b[8];  
} u;

void loop() {
if (u.b[3]) 
    Serial.println ("Aber Hallo!");
if (u.b[5]) 
    Serial.println ("hier nicht");
while (true);
}
Und er sagt schön brav: "Aber Hallo!"
Zuletzt geändert von TuxPeter am 14.12.2020 13:09:38, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Variablen "überlagern" in C bzw. C++

Beitrag von Meillo » 14.12.2020 13:02:31

TuxPeter hat geschrieben: ↑ zum Beitrag ↑
14.12.2020 12:52:13
Liegen denn in der "Union" Deines Besipiels die beiden Variablen "Übereinander", d. h. belegen den gleichen phys. Speicher?
Das genau ist der Zweck einer Union (im Gegensatz zu einem Struct): alle Members liegen an der gleichen Stelle. Die Groesse der Union ist die Groesse des groessten Members.

Was ich eigentlich will? Ich muss mit jedem Byte geizen im Arduino Nano, und wenn ich da durch geschicktes Speicherdesign usw. ein paar Adressier-Schritte oder anderweitig Bytes zur Laufzeit spare, dann kann das nur gut sein!
Typischerweise wuerde man eine Union mit einem Enum zusammen in ein Struct legen, damit man noch abspeichern kann, was man gerade in die Union reingespeichert hat, um dann in der korrekten Weise auslesen zu koennen, aber wenn du Speicher sparen willst, waere das die falsche Richtung.

Von Speicheroptimierungen habe ich insgesamt wenig Ahnung. Da koennen dir vielleicht andere hier noch ein paar Tipps geben.
Use ed once in a while!

Antworten