Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как правильно класть WORD, DWORD, BYTE


Автор: eXa 24.1.2008, 21:23
Код

struct test
{
DWORD d_1;
WORD d_2;
BYTE d_3;
}; test pack


Чем WORD, DWORD, BYTE между собой отличаются? Какая разница при чтении этих переменных
Код

pack.d_1 = 0x01;
pack.d_2 = 0x01;
pack.d_3 = 0x01;

 
Как правильно записать 00 00 00 01 в DWORD,   00 01 в WORD,  F4 A1 в BYTE. Можеть статьи есть какие?)



Автор: archimed7592 24.1.2008, 21:25
eXa, чего, куда и откуда класть? Что за огрызок кода? В чём заключается сам вопрос?

Автор: eXa 24.1.2008, 21:30
поправил... нечайно создал тему не дописав вопроса)

Автор: archimed7592 24.1.2008, 21:38
eXa, 
Код

pack.d_1 = 0x00000001;
pack.d_2 = 0x0001;
pack.b = 0xf4;

Теперь такие моменты:
1. Засунуть в BYTE два байта(f4 a1) невозможно.
2. Именовать переменную 2_3 недопустимо.

Добавлено через 5 минут и 18 секунд
Цитата(eXa @  24.1.2008,  21:23 Найти цитируемый пост)
Чем WORD, DWORD, BYTE между собой отличаются? 

Размером.
DWORD - 4 байта
WORD - 2 байта
BYTE - угадай сам smile.
И, соответственно, диапазоном возможных значений.

Автор: eXa 24.1.2008, 21:51
Код


typedef struct test
{
      BYTE  text_1;
      BYTE  mat_1;
      WORD  text_2;
      WORD  mat_2;
      DWORD text_3;
      DWORD mat_3;
};

struct test packet;

int main()
{
     packet.text_1 = 0x2A;
     packet.mat_1 = 0x2F;
     packet.text_2 = 0x0002;
     packet.mat_2 = 0x3542;
     packet.text_3 = 0x00000001;
     packet.mat_3 = 0x00000002;
     printf("%x", packet);
}


Печать:22f2a

Почему выводит только
 packet.text_1 = 0x2A;
 packet.mat_1 = 0x2F;
 packet.text_2 = 0x0002;

и почему идёт запись с конца?

Автор: archimed7592 24.1.2008, 22:05
Смотри, есть такой тип int. AFAICS - на твоём компиляторе int занимает 4 байта. Форматной инструкцией %x ты говоришь printf'у вывести на экран одну переменную типа int в шестнадцатиричном виде, а передаёшь ты ему целую структуру размером, заведомо большим, чем размер int, но, т.к. printf не знает что именно ты ему передал, он может только "догадываться", основываясь на форматных инструкциях, которые ты ему указал. Т.к. ты попросил вывести число типа int он его и выводит, а то что там дальше ещё байты есть - ему до лампочки(я бы даже сказал, что это очень плохо, что ты передаёшь ему больше данных, чем заявил - может привести к повреждению стека).

Добавлено через 4 минуты и 57 секунд
Цитата(eXa @  24.1.2008,  21:51 Найти цитируемый пост)

и почему идёт запись с конца?

http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2(http://en.wikipedia.org/wiki/Endianness лучше).

Автор: MAKCim 24.1.2008, 22:21
Цитата(archimed7592 @  24.1.2008,  22:05 Найти цитируемый пост)
что это очень плохо, что ты передаёшь ему больше данных, чем заявил - может привести к повреждению стека

не может

Автор: archimed7592 24.1.2008, 22:36
Цитата(MAKCim @  24.1.2008,  22:21 Найти цитируемый пост)
не может 

Похоже, что ты прав smile.

Автор: eXa 24.1.2008, 22:38
Как я понимаю правильная запись для последующей передачи по сети будет выглядить так?
Код

  packet.text_1 = htons(0x2A);
  packet.mat_1 = htons(0x2F);
  packet.text_2 = htons(0x0002);
  packet.mat_2 = htons(0x3542);
  packet.text_3 = htons(0x00000001);
  packet.mat_3 = htons(0x00000002);


Цитата

я бы даже сказал, что это очень плохо, что ты передаёшь ему больше данных, чем заявил - может привести к повреждению стека


И как правильно тогда передавать данные?

Автор: MAKCim 24.1.2008, 22:44
Цитата(eXa @  24.1.2008,  22:38 Найти цитируемый пост)
И как правильно тогда передавать данные?

правильно - это когда спецификация тождественна переданным данным

Автор: eXa 24.1.2008, 23:03
Цитата

правильно - это когда спецификация тождественна переданным данным

что тут правильней чем %x O_o
Код

c    Character    a
d or i    Signed decimal integer    392
e    Scientific notation (mantise/exponent) using e character    3.9265e+2
E    Scientific notation (mantise/exponent) using E character    3.9265E+2
f    Decimal floating point    392.65
g    Use the shorter of %e or %f    392.65
G    Use the shorter of %E or %f    392.65
o    Signed octal    610
s    String of characters    sample
u    Unsigned decimal integer    7235
x    Unsigned hexadecimal integer    7fa
X    Unsigned hexadecimal integer (capital letters)    7FA
p    Pointer address    B800:0000
n    Nothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored.    
%    A % followed by another % character will write % to stdout.


Мне главное очень важно знать, для передачи по сети, эта правильная запись?
Код

packet.text_1 = htons(0x2A);
packet.mat_1 = htons(0x2F);
packet.text_2 = htons(0x0002);
packet.mat_2 = htons(0x3542);
packet.text_3 = htons(0x00000001);
packet.mat_3 = htons(0x00000002);

Автор: MAKCim 24.1.2008, 23:07
eXa, 
в printf передавай значения полей структуры (согласно приведенной тобой спецификации), а не саму структуру

Автор: eXa 24.1.2008, 23:35
MAKCim только по полям выводить, разве нельзя всю сразу? на то она и структура...

Автор: jonie 25.1.2008, 00:19
можно все... вопрос зачем?
вы главное не забывайте про 1) выранивание полей в структуре 2)необходимости того что вы делаете 3)в стек будет (у вас) вместо байта (Если вдруг захотите пихать его вообще) пихаться int ("особенность процессора")

Автор: archimed7592 25.1.2008, 07:38
Цитата(jonie @  25.1.2008,  00:19 Найти цитируемый пост)
"особенность процессора"

 smile Особенности языка...

Сообщения были разделены в тему http://forum.vingrad.ru/index.php?show_type=forum&showtopic=193068

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)