BlackMark
Lt. Commander
- Registriert
- Juni 2007
- Beiträge
- 1.346
Nein, das ist nicht was das bedeuetet. Punkt 3 bedeutet, dass nicht garantiert wird, dass man einen Integer in einen Pointer casten kann, und dann wieder zurück in einen Integer, der den selben Wert hat. Als Code:firespot schrieb:Somit ist nicht garantiert dass inwrite
der ursprüngliche integer-Wert wiederhergestellt werden kann.
C++:
const auto val = intptr_t{1234};
const auto* val_as_ptr = reinterpret_cast<void*>(val);
const auto val_from_ptr = reinterpret_cast<intptr_t>(val_as_ptr);
assert(val == val_from_ptr); // Not guaranteed
Es geht in dem Code von mir ja nicht darum einen Integer in einem Pointer-Type zu speichern, sondern nur darum einen
const uint8_t*
in einen const char*
umzuwandeln, und das ist auf jeden Fall standardkonform. Der Standard garantiert, dass man char*
, und unsigned char*
, und deshalb auch uint8_t*
(typedef für unsigned char
), und std::byte*
(seit C++17) verwenden darf um raw data anzusehen.https://en.cppreference.com/w/cpp/language/types
https://en.cppreference.com/w/cpp/types/byteunsigned char
- type for unsigned character representation. Also used to inspect object representations (raw memory).
Likechar
andunsigned char
, it can be used to access raw memory occupied by other objects (object representation)
Das darf man aber nur mit diesen Typen machen. Für alles andere gelten die strict aliasing Regeln von C++.
Endianness spielt keine Rolle im Kontext von einem einzigen Byte. Undfirespot schrieb:Und wennwrite
nur die erstenlength
-bytes vom übergebenen pointer-Wert nutzt, frage ich mich ob je nach little oder big endian es dann auch garantiert die "richtigen" bytes nutzt.
sizeof(uint8_t) == sizeof(char) == 1
, garantiert der Standard. Es wird also immer nur 1 Byte von write
angesehen. Nämlich wird das uint8_t
byte, aliased als char
von write
angesehen, und das ist okay, weil der Standard sagt:https://en.cppreference.com/w/cpp/language/types
For every value of typeunsigned char
in range [0, 255], converting the value tochar
and then back tounsigned char
produces the original value.
Wir müssen natürlich voraussetzen, dass diefirespot schrieb:Solange wir aber nicht genau wissen, waswrite
intern überhaupt mit den Parametern macht und in was esdata
zurückcastet, ist es generell schwierig hier komformen Code aufzusetzen.
write
Funktion selbst standardkonform ist, das sollte soweit klar sein. Aber sofern das gegeben ist, ist es kein Problem damit standardkonformen Code zu schreiben. Zum Beispiel könnte man:
C++:
const auto val = 1234;
i2cInterface->write(i2cAddress, reinterpret_cast<const char*>(&val), sizeof(val), true);
char
raw data ansehen darf, also kann man auch die einzelnen Bytes eines Integer damit ansehen. Das gilt auch für beliebige C++ Objekte, könnte also auch eine Klasse sein, statt einem Integer.Gruß
BlackMark