инициализация структуры указателем - PullRequest
0 голосов
/ 11 февраля 2019

Как использовать этот указатель mxt_config *cfg для присвоения значения, хранящегося в массиве?Основная идея заключается в назначении значения массива в порядке смещения указателя на следующий элемент структуры.

typedef struct
{
  unsigned char F_Id;
  unsigned char V_Id;
  unsigned char Ve; 
  unsigned char Bu; 
  unsigned char Mat;
}InfoId_t;

struct mxt_config 
{
  InfoId_t id;
  unsigned char info_crc;
  unsigned char config_crc;
};

int main()
{
    unsigned char line1[7] = {0x1,0x2,0x3, 0x4, 0x5,0x6, 0x7};
    mxt_config  *cfg = NULL;
    mxt_config  objcfg;
    cfg = &objcfg;

    for (int i = 0; i < 7; i++) 
    {
        (unsigned char*)&cfg->id + i = line1[i];
    }
}

Любая помощь будет отличной, потому что наверняка что-то не так, но я не вижу, что.

заранее благодарю

1 Ответ

0 голосов
/ 12 февраля 2019

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

[class.mem] / 17: Нестатические члены-данные класса с одинаковым контролем доступа распределяются так, чтобы более поздние члены имели более высокие адреса в объекте класса.(...) Требования к выравниванию реализации могут привести к тому, что два соседних элемента не будут выделяться сразу после друг друга;так могут предъявляться требования к пространству для управления виртуальными функциями и виртуальными базовыми классами.

Тот факт, что все члены unsigned char снижает риск (например, нет проблем с выравниванием, нет неожиданностей по порядку байтов), но это не гарантируетсяработать на 100%.Вы должны по крайней мере утверждать, что структура имеет ожидаемый размер, чтобы избежать неприятных сюрпризов:

assert(sizeof(mxt_config)==7);

Если, несмотря на риски, вы хотите продолжить, вам необходимо исправить свой код:

for (int i = 0; i < 7; i++) 
{
   *((unsigned char*)&cfg->id + i) = line1[i];     
}

В качестве альтернативы, вы можете выбрать алгоритм, std::copy():

copy (line1,  line1+7,  reinterpret_cast<unsigned char*>(&cfg->id));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...