Приведение типов. Как можно обмануть компилятор?

rene
Offline
Зарегистрирован: 21.01.2014

Доброго времени суток!

Есть бинарный массив, напрмер:

byte buffer[] = { 0x15, 0x1, 0x0, 0x0, 0x0, 0x3, 0x11 }

Мне необходимо взять первые 4 байта и перевести их в число unsigned long

unsigned long *ptrBuffer = &buffer;

Но тут компилятор категорически отказывается делать такое безобразие. Я так понимаю необходимо приведение типов перед использованием указателя, но что то не получается. Подскажите как это сделать.

ЗЫ. Понимаю что можно сделать так

buffer[0] + buffer[1] * 256 + buffer[2] * 65536 + buffer[3] * 16777216

но как то это громозко и не спортивно

rene
Offline
Зарегистрирован: 21.01.2014

Хех! Вот же оно!

  byte buffer[] = { 0x15, 0x1, 0x0, 0x0, 0x0, 0x3, 0x11 };
  unsigned long *ptrBuffer = (unsigned long*)&buffer;
  Serial.begin(9600);
  Serial.println(*ptrBuffer);

Результат!

277

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Всего-то подумать надо было! И чего не подумать прежде, чем десткий вопрос постить? Почему наоборот всегда?

Кстати, уберите & во второй строке. "На скорость", конечно, не влияет, но некрасиво.

rene
Offline
Зарегистрирован: 21.01.2014

(unsigned long*)buffer

от меня ускользает смысл вот этого действия (то что в скобках), где можно об этом почитать?

lex2k
Offline
Зарегистрирован: 17.12.2015

  (unsigned long*) это тип к которому приводится данные, а символ * говорит о том что это не переменная а указатель на переменную т.к. unsigned long *ptrBuffer- тоже не переменная а указатель на переменную 

rene
Offline
Зарегистрирован: 21.01.2014

Спасибо!

lex2k
Offline
Зарегистрирован: 17.12.2015

почитай по С++

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Чтобы не париться с приведением типов, а также совершить меньше ошибок, сделайте структуру, типа:

struct BlaBla
{
  unsigned long value;
...
};

Это визуально понятней, да и кошерней. Если не знаете, что такое struct, почитайте - в гугле море информации.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rene пишет:

(unsigned long*)buffer

от меня ускользает смысл вот этого действия (то что в скобках), где можно об этом почитать?

http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

Alexino
Offline
Зарегистрирован: 29.12.2015




union my_buf{
   byte buf[8];
   struct{
      unsigned long    var_1;
      unsigned long    var_2;
   };
};

Адреса у переменных var_x будут совпадать с адресами буфера 0-вого и 4-ого индекса.
И никаких лишних переменных, всё в одной области памяти.

Читаем  - Union

Logik
Offline
Зарегистрирован: 05.08.2014

Оба метода хороши. И код дадут в общем одинаковый. Приведение считается менее соответствующим концепции языка и дающим больше шансов програмисту ошибится. Юнионы явно задают соответствие переменных, зато более громоздкие и снижают читаемость кода. Профи чаще "шалят" с приведением, за что иногда выгребают.

Вобще прииспользовании таких техник важно знать что такое выравнивание данных и следить за ним. 

rene
Offline
Зарегистрирован: 21.01.2014

Всем спасибо за помощь!