Avatar billede krismort Nybegynder
07. december 2002 - 16:11 Der er 8 kommentarer og
2 løsninger

struktur?

Hvorfor har disse 2 strukturer ikke samme længde?

struct S1{
  BYTE CMD;
  BYTE IPADDR[4];
  BYTE PORT[2];
  BYTE VAR1[30];
  BYTE VAR2[30];
};

struct S2 {
  BYTE CMD;
  unsigned float IPADDR;
  unsigned short PORT;
  BYTE VAR1[30];
  BYTE VAR2[30];
};

Lige nu bruger jeg S1 til at læse fra en fil og det fungerer godt nok ... men det er irriterende at man skal kopierer IPADDR og PORT over i 2 andre variabler før man kan læse og bruge dem så jeg har prøvet at med S2 men det virker ikke :( hvorfor f****** har de ikke samme længde ? der er som om at min PORT fylder 3 bytes i S2 .. men det giver jo ikke nogen mening.

Kristian
Avatar billede kamikaze Nybegynder
07. december 2002 - 16:17 #1
I den ene har du variabler af typen BYTE (8 bit lang) og i den anden har du variabler af typen unsigned float (32 bit lang, så vidt jeg husker). Derfor bliver den struct med float i længere end den anden.
Avatar billede kamikaze Nybegynder
07. december 2002 - 16:19 #2
Hvis jeg har ret i at en float er 32 bit lang, så burde

struct S1{
  BYTE CMD;
  BYTE IPADDR[4];
  BYTE PORT[4]; // <-- 4 x 8 bits = 32 bits = unsigned float længde
  BYTE VAR1[30];
  BYTE VAR2[30];
};

være ligeså lang som den anden struct.
Avatar billede kamikaze Nybegynder
07. december 2002 - 16:20 #3
sorry, så ikke lige at du bruger en unsigned short i den første struct. Jeg mener også en short er 32 bits lang ?!?
Avatar billede kamikaze Nybegynder
07. december 2002 - 16:26 #4
Nope, en short er 16 bits. Hmmmm....så er jeg lige lost!!!
Avatar billede kamikaze Nybegynder
07. december 2002 - 16:31 #5
Jeg tror det er pga. memory-alignment. Din PC kan kun adressere 32 bits. Derfor bliver der sat 32 bits af til CMD, når du benytter en float. Lidt efter flg. princip:

// |--------|--------|--------|--------|
// |CMD    |        |        |        |
// |IPADDR  |        |        |        |
// etc.

// |--------|--------|--------|--------|
// |CMD    |IPADDR1 |IPADDR2 |IPADDR2 |
// etc.
Avatar billede kamikaze Nybegynder
07. december 2002 - 16:32 #6
(hvor den øverste række er ved brug af float, og den nederste er ved brug af BYTE - det skulle vist have været courier font :o)
Avatar billede kamikaze Nybegynder
07. december 2002 - 16:48 #7
Dvs. at hvis du bytter om på rækkefølgen i deklarationen, ændrer du også størrelsen:

struct S1{
  BYTE IPADDR[4];
  BYTE PORT[2];
  BYTE CMD;
  BYTE VAR1[30];
  BYTE VAR2[30];
};

struct S2 {
 
  unsigned float IPADDR;
  unsigned short PORT;
  BYTE CMD;
  BYTE VAR1[30];
  BYTE VAR2[30];
};

Her er størrelserne 67 bytes og 68 bytes, istedetfor som før 67 og 72.
Avatar billede doctorseb Nybegynder
07. december 2002 - 17:20 #8
Det korrekt i ovenstående er, at "fjerne" compilerens memory alignments. Prøv at smide

  #pragma pack(1)

i toppen af din fil - så skulle den være i orden...

Happy coding,
/doctorseb!
Avatar billede doctorseb Nybegynder
07. december 2002 - 17:20 #9
Ovenstående skulle vist ha' været et svar - ups :]
Avatar billede krismort Nybegynder
08. december 2002 - 11:24 #10
takker ... hvis man sætter IPADDR til unsigned long og bruger #pragma pack(1) så fungerer det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester