Hallo, ich versuche in einem Array auf einzelne Elemente über
Pseudovariablen zuzugreifen. Das funktioniert bisher nur, wenn die Typen
exakt gleich definiert sind.
Beispiel:
1 | uint16_t memory[10];
|
2 |
|
3 | uint16_t &a = memory[0]; // geht
|
4 | int16_t &b = memory[1]; // geht nicht
|
5 | int16_t &c = (int16_t) memory[2]; // geht nicht
|
6 | int16_t &d = (int16_t) &memory[3]; // geht nicht
|
Variable a liegt an der gleichen Adresse wie memory[0]. Ich kann die
Variable lesen und schreiben und die Schreibweisen "a" und "memory[0]"
synonym benutzen.
Leider funktioniert das nicht, wenn ich Variablen von einem anderen Typ
anlege (int16_t anstatt uint16_t).
Bei Variable b erhalte ich folgende Fehlermeldung:
1 | int_uint:4: error: invalid initialization of non-const reference of type 'int16_t& {aka short int&}' from an rvalue of type 'int16_t {aka short int}'
|
Ich dachte, dass ein cast hier hilft (siehe Variable c), aber leider tut
es das nicht:
1 | int_uint:5: error: invalid initialization of non-const reference of type 'int16_t& {aka short int&}' from an rvalue of type 'int16_t {aka short int}'
|
Nach etwas Probieren bin ich auf die Deklaration der Variable d
gekommen, die zwar immer noch eine Fehlermeldung produziert, welche aber
weniger schlimm klingt.
1 | int_uint:6: error: cast from 'uint16_t* {aka short unsigned int*}' to 'int16_t {aka short int}' loses precision [-fpermissive]
|
Mit "loses precision" kann ich leben, das ist ja sogar gewollt. Aber wie
sage ich das dem Compiler?
Wie kann ich weiter vorgehen?
Ist es möglich, z.B. ein zweites Array als int16_t zu definieren, das an
der gleichen Adresse wie "memory[10]" liegt?
Dann könnte ich sagen:
1 | int16_t &signedmemory[10] = memory[10];
|
2 | int16_t &b = signedmemory[1];
|
Leider funktioniert es so natürlich nicht. Habe ich schon probiert.
Google ist hier ausnahmsweise nicht so hilfreich, da bei der Suche nach
Signed und Unsigned Variablen immer nur grundlegende Beschreibungen zum
Unterschied von Signed und Unsigned der C++ Typen gefunden werden.
Außerdem möchte ich gerne noch 32 Bit integer im selben Array ablegen
können.
Wer weiß Rat?