Присвойте массив переменного размера массиву фиксированного размера c - PullRequest
0 голосов
/ 02 мая 2018

У меня есть буфер символов, определенный как char *buffer. Когда я отправляю свои данные пакета XBEE, существует требование фиксированного размера (84 байта). Моя проблема в том, что я не знаю, как преобразовать буфер в 84-байтовые куски во время итерации. Вот что я получаю:

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
     packet = (buffer + i);
            ^

И мой код:

int sendSerialBuffer(char *buffer, int length)
{
  int i = 0;
  int result = 0;
  char (* packet)[84];

  // Iterate through all the bytes in the buffer
  for (i = 0; i < length; i = i + 84)
  {
    packet = (buffer + i);
    result = sendPacket(packet)
  }
  return 0;
}

Редактировать : Я также попытался объявить пакет как char packet[84]; и получить:

error: assignment to expression with array type
     packet = (buffer + i);
            ^

Также sendPacket определяется как: sendPacket(char packet[84]);

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Это не работает:

packet = (buffer + i);

Потому что типы не совпадают. packet имеет тип char (*)[84] (то есть указатель на массив 84 char), в то время как buffer имеет тип char *. Вам на самом деле не нужен этот дополнительный тип.

Учитывая, что sendPacket определяется как:

int sendPacket(char packet[84])

Параметр packet фактически имеет тип char *, поскольку массивы в качестве параметров функции decay превращаются в указатель на первый элемент.

Затем вы можете вызвать эту функцию следующим образом:

result = sendPacket(buffer + i)

Выражение buffer + i вычисляется по адресу элемента i в буфере. Предполагая, что sendPacket читает 84 байта с этого адреса, он будет захватывать следующие 84 байта в буфере.

0 голосов
/ 02 мая 2018
int i = 0;
int result = 0;

// Iterate through all the bytes in the buffer
for (i = 0; i < length; i = i + 84)
{
  char packet[84];
  memcpy(packet, buffer[i],84);
  result = sendPacket(packet);
}

return 0;  

обратите внимание, что это не относится к случаю, когда буфер не кратен 84

жизнь будет проще, если sendPAcket ожидает char *, а не char [84]. Тогда код будет читать

int i = 0;
int result = 0; 

// Iterate through all the bytes in the buffer
for (i = 0; i < length; i = i + 84)
{
  char packet[84];
  memcpy(packet, buffer[i],84);
  result = sendPacket(buffer[i]);
}

return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...