Я работаю с микроконтроллерами и получил следующий рабочий код:
.h файл
const static uint8_t state0[] = "Off";
const static uint8_t state1[] = "ROMLoad";
const static uint8_t state2[] = "RAMLoad";
const static uint8_t state3[] = "PacketSend";
const static uint8_t state4[] = "Process";
.с файл
switch (coapapp_vars.state) {
case 0:
packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
memcpy(&msg->payload[0], &state0, sizeof(state0) - 1);
break;
case 1:
packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
memcpy(&msg->payload[0], &state1, sizeof(state1) - 1);
break;
case 2:
packetfunctions_reserveHeaderSize(msg, sizeof(state2) - 1);
memcpy(&msg->payload[0], &state2, sizeof(state2) - 1);
break;
case 3:
packetfunctions_reserveHeaderSize(msg, sizeof(state3) - 1);
memcpy(&msg->payload[0], &state3, sizeof(state3) - 1);
break;
case 4:
packetfunctions_reserveHeaderSize(msg, sizeof(state4) - 1);
memcpy(&msg->payload[0], &state4, sizeof(state4) - 1);
break;
}
Я хочу изменить этот код, чтобы сократить файл (чтобы было загружено меньше кода), вызвав memcpy после переключения. Поэтому мне нужно использовать указатель, который указывает на правильное значение из .h, используя случаи для заполнения указателя. К сожалению, мне не удалось заставить его работать. Так что я совершенно не понимаю, где мне нужно использовать * или &, или вообще не использовать, чтобы это заработало. Я пробовал много разных способов, но ни один не удался.
Тогда возникают вопросы: какой тип uint8_t (uint8_t/uint8_t*/uint8_t**) использовать для инициализации переменной, указывающей на один из массивов символов? Как заполнить эту переменную (указатель) (ptr = state/ptr = &state/ptr=&state[0]/...)? Как мне использовать переменную (указатель) в функции memcpy (ptr/&ptr/*ptr/&(*ptr)/...)?
Я знаю, что мне нужно будет использовать переменную, которую я установил для размера.
При необходимости дополнительная информация: этот код используется в OpenWSN. Я работаю с устройством/микроконтроллером IoT. Я использую их реализацию COAP для отправки информации в браузер.
Редактировать: как функция backupHeaderSize, так и функция memcpy будут размещены после переключателя. Как указано в правильном ответе, это довольно просто, но я продолжал упускать из виду небольшую глупую ошибку с моей стороны: я не удалял sizeof в третьем аргументе, поэтому я в основном делал sizeof (size). Дерп
const static
устарело. C хочет, чтобы вы вместо этого использовалиstatic const
. Кроме того, не сразу понятно, почему вы настаиваете на наличии нескольких копий исходных литералов (отдельный набор в каждой единице перевода) вместо того, чтобы работать с исходными литералами напрямую. Просто чтобы иметь возможность использоватьsizeof
? - person AnT   schedule 06.02.2017