Что значит запись (byte*)

Здравствуйте!
что значит запись (byte*) в примере про CRC.
что здесь делает *
if (Serial.readBytes((byte*)&rxData, sizeof(rxData)))
https://arduino.ru/forum/programmirovanie/peredat-i-prinyat-integer-po-serial?page=1#comment-318007

1 лайк

Ну это легкотня, вот:

1 лайк

Да я знаком с темой “указатели”, но не понимаю как читать эту запись…

1 лайк

вроде как массив хранит целые числа, но читается как массив байт… но зачем *?

1 лайк

о прошу прощение ссылку прикрепил не на тот источник.

введите или вставьте// структура данных посылки
struct MyData {
  byte channel;
  int val_i;
  float val_f;
  byte crc;  // байт crc
};
MyData rxData;

void setup() {
  Serial.begin(9600);
}

void loop() { 
  if (Serial.readBytes((byte*)&rxData, sizeof(rxData))) { // читаем дату 
    byte crc = crc8((byte*)&rxData, sizeof(rxData)); // считаем crc посылки полностью
    if (crc == 0) {
      // данные верны
    } else {
      // данные повреждены
    }
  }
}

byte crc8(byte *buffer, byte size) {
  byte crc = 0;
  for (byte i = 0; i < size; i++) {
    byte data = buffer[i];
    for (int j = 8; j > 0; j--) {
      crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1);
      data >>= 1;
    }
  }
  return crc;
} сюда код
1 лайк

byte crc8(byte buffer, byte size)
вот здесь все понятно, а здесь нет:
Serial.readBytes((byte
)&rxData, sizeof(rxData))

1 лайк

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

2 лайка

Здесь мне тоже непонятно. Вы зачем звёздочку убрали? А оригинале было

1 лайк

Если перед выражением записан тип данных в скобках, то это значит, что данное выражение насильно приводится к этому типу “принудительная конвертация”.
Раз там это понадобилось, то значит, что указатель одного типа приводится к указателю на byte.

1 лайк

х…ция, это называется приведение типов. До тех пор, пока не знаешь точно значения этих слов, не употребляй их, пиши своими словами, и прочитай, наконец, по ссылке насчет указателей.

2 лайка

Потому что crc8 ожидает в параметре byte * - указатель на байты. Указатель на int-ы несовместим с ним, поэтому принудительно конвертируется. Звёздочка нужна обязательно чтобы получился нужный тип.

2 лайка

Был бы ты бабой, подумал бы, что у тебя жуткий недотрах.

1 лайк

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

2 лайка

Пару дней этот форум почитываю и та лёгкость с которой какие то пустяки и неважные вещи вызывают агрессию, обвинения и срачи удивляет. Терпимее надо быть. :slight_smile:

3 лайка

Кому?

1 лайк

Всем. Это заранее выгодная позиция.
А то может оказаться, что русское “приведение типов” по английски это “type conversion”.
И получается неудобно.

1 лайк

неудобно - это когда дети на соседа похожи, а вы, дяденька, балабол.

1 лайк

А еще coercion и jugglinh, но статья на вики названа именно conversion.

1 лайк

ну а чево ты до конца не дочитал? клиповое мышление? СДВГ мешает? ПТСР? Там же понятным английским языком написано, как для дебилов:

In the C family of languages and ALGOL 68, the word cast typically refers to an explicit type conversion (as opposed to an implicit conversion), causing some ambiguity about whether this is a re-interpretation of a bit-pattern or a real data representation conversion. More important is the multitude of ways and rules that apply to what data type (or class) is located by a pointer and how a pointer may be adjusted by the compiler in cases like object (class) inheritance.

и еще ниже:

изображение

1 лайк

но “also called” означает не “называемое только”, а напротив “называемое так же”.
Это значит оба термина верны.

В итоге мы имеем уже десяток комментариев вокруг вопроса который
а) никто не задавал
б) никому не нужен
в) ни на что не влияет
г) терминологически верно и то и другое и еще и третье с четвертым.

Мораль по моему очевидна - и начинать не стоило.

3 лайка