Массив указателей
Задача: на микроконтроллер приходит запрос на отправку от 1 до 10 unsigned short'ов, микроконтроллер должен сформировать пакет данных содержащий
- несколько протокольных байтов
- от 1 до 10 unsigned short'ов сообщения
- crc.
Предполагаемое решение: чтобы расчет crc производился верно, планирую в .hpp файле создать структуру массивов размером от 1 до 10:
struct dataBufer {
unsigned short oneSize[1];
unsigned short twoSize[2];
unsigned short threeSize[3];
...
unsigned short tenSize[10];
} ;
Так как размер сообщения я буду получать из переменной, назовем ее n_byteX2
, хотелось бы не делать 10 if/else, а сделать что-то типа цикла в котором я бы мог заносить в указатель newDataBufer[размер буфера].num[порядковый номер элемента буфера]
, не обязательно прям так, но это то, к чему я пришел.
У меня есть файл modbus.hpp, в котором есть класс Modbus, внутри которого я бы и хотел все это разместить, чтобы в modbus.cpp я бы мог обращаться к этому массиву в различных void. Вот какое решение у меня:
//modbus.hpp
class Modbus{
public:
struct dataBufer {
unsigned short oneSize[1];
unsigned short twoSize[2];
unsigned short threeSize[3];
...
unsigned short tenSize[10];
} ;
struct DB_info {
unsigned short* num;
unsigned char size;
} ;
}
//modbus.cpp
void ModBus::initial(void){
databufer db;
DB_info newDataBufer[] = {
{db.oneSize, 1},
{db.twoSize, 2},
...
{db.tenSize, 10},
};
};
Этот код работает прямо так, как хочу я, но при условии, что все обращения будут внутри initial, а мне необходимо обращаться в различных функциях внутри одного .cpp файла. Как это можно было бы обойти в условии, что я использую компилятор 2006 года, который естественно не поддерживает современные версии с++.
UPD:
добавил функцию CRC, она не моя и вносить правки в нее я не особо то и могу.
unsigned short System::CRC (unsigned char *puchMsg, unsigned long usDataLen){
unsigned char uchCRCH = 0xff;
unsigned char uchCRCL = 0xff;
unsigned char uIndex;
while (usDataLen--) {
uIndex = uchCRCL ^ *puchMsg* ;
uchCRCL = uchCRCH ^ auchCRCH[uIndex];
uchCRCH = auchCRCL[uIndex];
}
return (((unsigned short)uchCRCH << 8) | uchCRCL ) ;
Можно проверять массив и не до конца, но формат посылки примерно такой:
[адрес устройства][функция][количество байтов данных][байт1][байт2][байт3][байт4][crcH][crcL]
Если бы все, что мне требовалось - это обрезать, например байт4, то проблемы особо нет, но если мне требуется обрезать байт 1 при подсчете crc он все равно будет учитываться.