C:Некоторые проблемы с указателем на uint8_t[]

Я работаю с микроконтроллерами и получил следующий рабочий код:

.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). Дерп


person Whitekang    schedule 06.02.2017    source источник
comment
Обратите внимание, кстати, что const static устарело. C хочет, чтобы вы вместо этого использовали static const. Кроме того, не сразу понятно, почему вы настаиваете на наличии нескольких копий исходных литералов (отдельный набор в каждой единице перевода) вместо того, чтобы работать с исходными литералами напрямую. Просто чтобы иметь возможность использовать sizeof?   -  person AnT    schedule 06.02.2017


Ответы (1)


Если я вас правильно понял, вы хотите назначить переменную указателя в каждом case, чтобы впоследствии вы могли вызывать memcpy(). Если так то все просто. Вам нужно только установить размер для копирования в каждом случае, но вы уже упомянули об этом.

Вот как это происходит:

    uint8_t *stateptr;    // pointers can be assigned to arrays
    size_t  size;

    switch (coapapp_vars.state) {
    case 0:
        packetfunctions_reserveHeaderSize(msg, sizeof(state0) - 1);
        stateptr = state0;
        size = sizeof state0;
        break;
    case 1:
        packetfunctions_reserveHeaderSize(msg, sizeof(state1) - 1);
        stateptr = state1;
        size = sizeof state1;
        break;
    // other cases
    }
    memcpy(&msg->payload[0], stateptr, size-1);

Обратите внимание, что в вашем коде вы также могли бы написать

  memcpy( &msg->payload[0], state0, sizeof state0 - 1 );

вместо ..., &state0, ....

person Ingo Leonhardt    schedule 06.02.2017
comment
Это действительно так просто... Я пробовал это раньше, но у меня не получилось из-за одной глупой ошибки, которую я постоянно пропускал... Я оставил sizeof() в memcpy и только заменил переменную состояния на переменную размера, в основном пишут sizeof(size), что явно неверно. Этот вопрос на самом деле устарел, но я хотел бы поблагодарить вас! Не читая ваш код, я бы продолжал упускать из виду эту небольшую ошибку. Так что еще раз большое спасибо! Это всегда маленькие глупые вещи, которые мешают, прячась на виду, пока мы ищем что-то сложное, чтобы быть неправильным. - person Whitekang; 06.02.2017
comment
Я это точно знаю :-) Рад, что смог помочь - person Ingo Leonhardt; 06.02.2017