offsety w strukturze.
Ostatnio zmodyfikowano 2017-09-11 22:02
mateczek Temat założony przez niniejszego użytkownika |
offsety w strukturze. » 2017-09-11 20:09:49 #include <iostream> using namespace std; struct { uint8_t bit1: 1, bit2: 1; uint8_t b1; uint16_t w1; uint16_t w2; uint32_t dw1; } blok;
int main() { uint8_t * wsk =( uint8_t * ) & blok; *( wsk + 6 ) = 100; *( wsk + 2 ) = 100; cout << blok.w1 << " " << blok.dw1; }
powyżej kod który opisuje mój problem. Jakiś czas temu napisałem sobie bibliotekę do komunikacji z PLC S7. Plan miałem prosty. 1. definiuje sobie strukturę odpowiadającą rozmieszczeniu danych w sterowniku plc 2. wysyłam wskaźnik na bufor i rozmiar bufora do biblioteki. 3 biblioteka kopiuje pamięć sterownika do bufora a ja se te dane czytam. Wszystko mi działało puki pisałem programy 32bit ale przy 64 bitach sprawa się sypie. Da się jakoś to uratować czy potrzebna zmiana koncepcji?? |
|
pekfos |
» 2017-09-11 20:31:28 Wyłącz wyrównanie dla tej struktury. Poczytaj o __attribute__((packed)), lub jego odpowiednikach, jeśli nie piszesz pod GCC. |
|
golibroda13 |
» 2017-09-11 20:32:15 Czy podczas budowania 32-bit i 64-bit operatory sizeof() i alignof() zwracają takie same wartości? |
|
mateczek Temat założony przez niniejszego użytkownika |
» 2017-09-11 22:02:12 __attribute__(( packed ) )
dzięki bardzo. Pomogło. biblioteka https://github.com/mateczek/qtPLC_libprogram testowy https://github.com/mateczek/PLCQTlibTestprogramponiżej ułożona mapa pamięci sterownika plc. Testowałem na: linux 64bity; windows mingw 32bity; windows msys2 64 bity. #if defined(__MINGW32__)||defined(__MINGW64__) #pragma pack(push, 1) #endif struct { PlcBYTE bit1: 1, bit2: 1, bit3: 1, bit4: 1, bit5: 1, bit6: 1, bit7: 1, bit8: 1; PlcBYTE bit9: 1, bit10: 1, bit11: 1, bit12: 1, bit13: 1, bit14: 1, bit15: 1, bit16: 1; PlcWORD dana; PlcBYTE dana2; PlcBYTE free; PlcDWORD b1; } #if defined(__GNUC__) __attribute__(( packed ) ) #endif db; #if defined(__MINGW32__)||defined(__MINGW64__) #pragma pack(pop) #endif |
|
« 1 » |