Odczyt pliku binarnego - złożona struktura

0

Witam,
mam następujące pytanie:
mam 2 klasy typu:

class Inner
{
float a,b;
}
class Main
{
int t;
Inner inner;
}

oraz plik binarny, w którym dane są zapisane w następujący sposób: int, float, float.
Moje pytanie brzmi: czy dane z owego pliku binarnego można ładować bezpośrednio do klasy Main? Tzn. czy klasa/struktura może zwierać wewnątrz kolejną strukturę (czy to jakoś nie przeszkadza)?
Czy kolejność zmiennych w klasie(ach) będzie zawsze zachowana? Tzn. czy kompilator nie zmieni mi np. kolejności t z inner albo b z a?

Z góry dziękuję za pomoc!

0

No można tak jak Ty to chcesz zrobić.

A nie prościej tak:

struct FileInsides {
   int i;
   float f1;
   float f2;
} /* __attribute__((packed));  niekoniecznie, ale moze byc to przydatne */

Generalnie Twój problem nazywa się w stylu "data alignment" bądź "struct alignment", szukaj po tych hasłach.

1

@Wielki Kot kolejności nie zmieni, ale jeśli któraś z tych klas będzie miała składniki wirtualne to sie posypie. Poza tym chyba może się zrobić jakieś wyrównanie, ale tego bałbym się bardziej dla pól bitowych.

0

@Shalom, @Wielki Kot tutaj akurat wyrównanie raczej nie będzie mieć znaczenia, bo typowo to i int i floaty mają długość 32b. Ale już przy wsadzeniu tam char mógłby być problem:
http://ideone.com/S4IYB3

No i na pewnych architekturach (na pewno na ARM) zły alignment może spowodować różne dziwne rzeczy (na ARM wywołuje jakiegoś typu sprzętowy wyjątek, nie pomnę który).

0

Dziękuję za odpowiedzi!
Mam jeszcze pytanie czy w 64 bitowym programie jest wyrównanie do 8 bajtów czy również do 4? Tzn. czy w moim przykładzie struktura nie zostanie zmieniona czy zostanie powiększona do 16 bajtów?
pozdrawiam

0

Sprawdź ;)

0

Więcej przykładów: http://ideone.com/jrZ9Aa

0
alagner napisał(a):

Sprawdź ;)

Done ;-).
W VS 2013 zaokrągla do 4 bajtów, ale czy tak będzie zawsze?

0

Eksperymentalnie to najprościej byłoby Ci wpisać do pól znane wartości i podejrzeć debugerem gdzie zaczyna się padding. Ale nie pomogę przy VS, używam gcc.
Ew. poszukaj tutaj
https://msdn.microsoft.com/en-us/library/71kf49f1.aspx

0

Ok, dzięki za pomoc!
pozdrawiam ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0