Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

offsety w strukturze.

Ostatnio zmodyfikowano 2017-09-11 22:02
Autor Wiadomość
mateczek
Temat założony przez niniejszego użytkownika
offsety w strukturze.
» 2017-09-11 20:09:49
C/C++
#include <iostream>
using namespace std;
struct {
    uint8_t bit1: 1, bit2: 1; //offset 0
    uint8_t b1; //offset 1
    uint16_t w1; //offset 2
    uint16_t w2; //offset 4
    uint32_t dw1; // tutaj problem!!! powinno być 6; a wsadził pod offset 8
} blok;

int main() {
    uint8_t * wsk =( uint8_t * ) & blok; //wskaźnik na bajt ustawiony na obiekt struktury.
    *( 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??




P-164803
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.
P-164805
golibroda13
» 2017-09-11 20:32:15
Czy podczas budowania 32-bit i 64-bit operatory sizeof() i alignof() zwracają takie same wartości?
P-164806
mateczek
Temat założony przez niniejszego użytkownika
» 2017-09-11 22:02:12
C/C++
__attribute__(( packed ) )
dzięki bardzo. Pomogło. 

biblioteka https://github.com/mateczek​/qtPLC_lib
program testowy https://github.com/mateczek​/PLCQTlibTestprogram


poniżej ułożona mapa pamięci sterownika plc. Testowałem na: linux 64bity; windows mingw 32bity; windows msys2 64 bity.
C/C++
#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
P-164811
« 1 »
  Strona 1 z 1