Verschiedene Variablen auf gleiche Speicherstelle
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Verschiedene Variablen auf gleiche Speicherstelle
Ich habe gerade eine Denkblockade: Wie lege ich verschiedene Variablen auf die gleiche Speicherstelle?
Ich habe 2 Variablen
hh, mm : uint8;
und 1 Variable
time : uint16;
In hh und mm werden Stunden und Minuten als gepackte BCD-Zahl gespeichert, das obere Nibble enthält also die Zehner, das untere Nibble die Einer.
Jetzt möchte ich die Variable time so ablegen, dass deren oberes Byte hh, das untere Byte mm enthält. Ich weiss dass das geht, aber ich komme gerade nicht drauf wie. Ich brauche das für den einfachen Vergleich von Uhrzeiten.
Ich könnte hh,mm auch als Record anlegen, würde das was bringen?
Compiliert werden soll für Embedded AVR, aber das sollte ja egal sein.
Ich habe 2 Variablen
hh, mm : uint8;
und 1 Variable
time : uint16;
In hh und mm werden Stunden und Minuten als gepackte BCD-Zahl gespeichert, das obere Nibble enthält also die Zehner, das untere Nibble die Einer.
Jetzt möchte ich die Variable time so ablegen, dass deren oberes Byte hh, das untere Byte mm enthält. Ich weiss dass das geht, aber ich komme gerade nicht drauf wie. Ich brauche das für den einfachen Vergleich von Uhrzeiten.
Ich könnte hh,mm auch als Record anlegen, würde das was bringen?
Compiliert werden soll für Embedded AVR, aber das sollte ja egal sein.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Verschiedene Variablen auf gleiche Speicherstelle
Ja. "Offiziell" darfst du dich nicht darauf verlassen, dass zusammenhängend definierte Variablen auch zusammenhängend im Speicher abgelegt werden.Timm Thaler hat geschrieben: Ich könnte hh,mm auch als Record anlegen, würde das was bringen?
Code: Alles auswählen
type
timeelementsty = packed record //little endian
mm: uint8;
hh: uint8;
end;
timety = packed record
case integer of
0: (elements: timeelementsty);
1: (time: uint16);
end;
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1650
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Verschiedene Variablen auf gleiche Speicherstelle
Hallo,
Das geht auch mit "absolute"
das sorgt dafür, daß die Variable time an der Speicherstelle anfängt wie die mit absolute angegebene.
Das geht auch mit "absolute"
Code: Alles auswählen
var
mm : uint8;
hh : uint8;
time : uint16 absolute mm;
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1650
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Verschiedene Variablen auf gleiche Speicherstelle
bei der Lösung von mse ist es übrigens nicht nötig zwei records zu definieren.
geht auch.
Code: Alles auswählen
type
TTimeRec = packed record
case integer of
0 : (mm, hh : uint8);
1 : (time : uint16);
end;
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Verschiedene Variablen auf gleiche Speicherstelle
Das ist dann aber nicht "offiziell", siehe oben.fliegermichl hat geschrieben: Das geht auch mit "absolute"
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Verschiedene Variablen auf gleiche Speicherstelle
Hm, das "packed record" hab ich gesehen, war mir aber nicht sicher, ob das "meine" Lösung ist.
Ist das immer "little endian", oder nur auf dem AVR?
Ich hab auch was mit "references" gelesen, finde aber keine Infos dazu. Such mal nach "fpc reference"... hunderte Einträge, aber nicht zielführend.
Ist das immer "little endian", oder nur auf dem AVR?
Ich hab auch was mit "references" gelesen, finde aber keine Infos dazu. Such mal nach "fpc reference"... hunderte Einträge, aber nicht zielführend.

- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1650
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Verschiedene Variablen auf gleiche Speicherstelle
Wenn ich mir die Freepascal Dokumentation anschaue, dann steht bei
6. The sixth form declares a variable (curterm6), and tells the compiler that it is stored in the same location as another variable (curterm1).
Ich kann nirgends "nicht offiziell" finden?!?
6. The sixth form declares a variable (curterm6), and tells the compiler that it is stored in the same location as another variable (curterm1).
Ich kann nirgends "nicht offiziell" finden?!?
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Verschiedene Variablen auf gleiche Speicherstelle
Die gezeigte Struktur ist für little endian. Universell:Timm Thaler hat geschrieben: Ist das immer "little endian", oder nur auf dem AVR?
Code: Alles auswählen
timeelementsty = packed record
{$ifdef endian_little}
mm: uint8;
hh: uint8;
{$else}
hh: uint8;
mm: uint8;
{$endif}
end;
"references" als FPC Token? Das kenne ich nicht.Ich hab auch was mit "references" gelesen, finde aber keine Infos dazu.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Verschiedene Variablen auf gleiche Speicherstelle
Man darf nicht erwarten, dass infliegermichl hat geschrieben: Ich kann nirgends "nicht offiziell" finden?!?
Code: Alles auswählen
var
mm : uint8;
hh : uint8;
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Verschiedene Variablen auf gleiche Speicherstelle
Und bei Records? Liegt beimse hat geschrieben:"hh" ein Byte nach "mm" im Speicher liegt. Der Compiler kann Variablen im Speicher anlegen wie es ihm passt.
Code: Alles auswählen
timetype = packed record
mm: uint8;
hh: uint8;
end;
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1650
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Verschiedene Variablen auf gleiche Speicherstelle
Meiner Meinung nach ja, sonst würden Deklarationen wie array of record oder file of record nicht funktionieren.Timm Thaler hat geschrieben:Und bei Records? Liegt beimse hat geschrieben:"hh" ein Byte nach "mm" im Speicher liegt. Der Compiler kann Variablen im Speicher anlegen wie es ihm passt.hh immer direkt hinter mm, little endian vorausgesetzt?Code: Alles auswählen
timetype = packed record mm: uint8; hh: uint8; end;
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Verschiedene Variablen auf gleiche Speicherstelle
Immer, sogar unbhängig von little- oder big-endian.Timm Thaler hat geschrieben: Und bei Records? Liegt beihh immer direkt hinter mm, little endian vorausgesetzt?Code: Alles auswählen
timetype = packed record mm: uint8; hh: uint8; end;
-
- Beiträge: 6945
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Verschiedene Variablen auf gleiche Speicherstelle
Bei diesem Code, könnte ich mir vorstellen, das es eine Rolle spielt.Immer, sogar unbhängig von little- oder big-endian.
Code: Alles auswählen
type
TTimeRec = packed record
case integer of
0 : (mm, hh : uint8);
1 : (time : uint16);
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Verschiedene Variablen auf gleiche Speicherstelle
Ja, dieser TTimeRec ist ausschliesslich für little-endian systeme.Mathias hat geschrieben:Bei diesem Code, könnte ich mir vorstellen, das es eine Rolle spielt.Immer, sogar unbhängig von little- oder big-endian.Code: Alles auswählen
type TTimeRec = packed record case integer of 0 : (mm, hh : uint8); 1 : (time : uint16); end;
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Verschiedene Variablen auf gleiche Speicherstelle
Bösartige Frage: Ist es möglich, den Record so zu modifizieren, dass ich drei Bytewerte habe, aber nur aus 2en ein Word mache?
hh, mm, ss : uint8 // so sieht meine Uhrzeit aus, die ich von der RTC bekomme
hhmm // das ist mein Zeitwert, auf den ich vergleiche
Ich würde also gern "time" so auf hh,mm,ss mappen, dass im Highbyte hh, im Lowbyte mm stehen und ss nicht beachtet wird.
Wird sicher nicht gehen, weil ja der case so nicht funktioniert.
Könnte vielleicht gehen, aber die Reihenfolge mm, hh, ss ist natürlich unschön.
hh, mm, ss : uint8 // so sieht meine Uhrzeit aus, die ich von der RTC bekomme
hhmm // das ist mein Zeitwert, auf den ich vergleiche
Ich würde also gern "time" so auf hh,mm,ss mappen, dass im Highbyte hh, im Lowbyte mm stehen und ss nicht beachtet wird.
Code: Alles auswählen
type
TTimeRec = packed record
case integer of
0 : (ss, mm, hh : uint8);
1 : (ss : uint8; time : uint16);
end;
Code: Alles auswählen
type
TTimeRec = packed record
case integer of
0 : (mm, hh, ss : uint8);
1 : (time : uint16; ss : uint8);
end;