Forum: Mikrocontroller und Digitale Elektronik Signed und Unsigned Integer-Mix Trouble im Array (C++, Teensy)


von Floppy (Gast)


Lesenswert?

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?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Floppy schrieb:
> Hallo, ich versuche in einem Array auf einzelne Elemente über
> Pseudovariablen zuzugreifen.

Was sind denn Pseudovariablen? Und was hast du überhaupt vor, warum 
willst du auf eine vorzeichenlose Variable zugreifen als wäre sie 
vorzeichenbehaftet?

von Oliver S. (oliverso)


Lesenswert?

Wenn es in C++ Pseudovariablen gäbe, ginge das vielleicht damit. Mit 
Referenzen geht es nicht.

Mit Pointern ginge es zwar prinzipiell, allerdings ist es dann 
plattformabhängiger Zufall, wenn das wie gewünscht funktioniert.

Oliver

von Felix U. (ubfx)


Lesenswert?

Greif doch einfach über Pointer auf das Array zu. Referenzen ergeben 
wenig Sinn in dem Zusammenhang. uint16_t* kannst du mit 
reinterpret_cast<> zu int16_t* casten.

Oliver S. schrieb:
> allerdings ist es dann
> plattformabhängiger Zufall, wenn das wie gewünscht funktioniert.

Wieso sollte das plattformabhängig sein?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Felix U. schrieb:
> Wieso sollte das plattformabhängig sein?
Weil Vorzeichenformate plattform-spezifisch sind. Allgemein ist der 
Zugriff auf Variablen über eine Referenz/Pointer anderen Typs 
plattformabhängig oder gleich ganz fehlerhaft.

von Felix U. (ubfx)


Lesenswert?

Niklas G. schrieb:
> Felix U. schrieb:
>> Wieso sollte das plattformabhängig sein?
> Weil Vorzeichenformate plattform-spezifisch sind. Allgemein ist der
> Zugriff auf Variablen über eine Referenz/Pointer anderen Typs
> plattformabhängig oder gleich ganz fehlerhaft.

Naja, dass er die Zahlen unterschiedlich interpretieren möchte, heißt ja 
schon, dass er vom Zweierkomplement oder irgendeinem anderen Format 
ausgeht. Sonst könnte er ja von vorneherein nur signed-Typen nutzen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Felix U. schrieb:
> Naja, dass er die Zahlen unterschiedlich interpretieren möchte, heißt ja
> schon, dass er vom Zweierkomplement oder irgendeinem anderen Format
> ausgeht.
Das ist die Frage. Mir ist nicht klar, was er überhaupt will. Einfache 
Signed->Unsigned Konvertierungen gehen auch per static_cast. Vielleicht 
geht es auch um Speicher sparen (union?) oder er braucht sowas wie 
Boost.Any.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.