Как изменить значение в массиве в структуре указателя из массива? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть массив структур типа can_frame, определенный в can.h как следующий:

struct can_frame {
    canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
    __u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
    __u8    __pad;   /* padding */
    __u8    __res0;  /* reserved / padding */
    __u8    __res1;  /* reserved / padding */
    __u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
};

Я инициализирую структуры следующим образом:

struct can_frame frame2;
frame2.can_id =  0x124;
frame2.can_dlc = 8;
frame2.data[0] = 0x00;
frame2.data[1] = 0x01;

Массив создается так:

struct can_frame frames[2];
frames[0] = frame;
frames[1] = frame2;

Позже, в той же функции, но в цикле while, я пытаюсь изменить один байт из массива данных, из одного из кадров. Сначала я пытаюсь получить указатель на один из фреймов, чтобы работать с ним дальше:

struct can_frame* to_change = &(frames[change_frame]);

Позже я пытаюсь обновить одно из следующих значений:

to_change->data[update_index] = anotherRandomNumber;

Однако значение в исходном кадре не изменяется. Что мне нужно сделать по-другому, чтобы изменить значение в оригинале вместо копии?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Я должен был сделать небольшую работу по угадыванию того, что вы хотели, так что не уверен, что это будет так, но дайте мне знать ...

В строках

struct can_frame frames[2];
frames[0] = frame;
frames[1] = frame2;

Я предполагаю, что frame и frame2 - это две другие структуры, определенные как struct can_frame frame, frame2 и затем инициализированные.

В строке

frames[0] = frame;

frames[0] получает копию данных в frame.

Итак, когда вы делаете

struct can_frame* to_change = &(frames[change_frame]);
...    
to_change->data[update_index] = anotherRandomNumber;

А затем проверьте либо frame, либо frame2, они не были изменены, поскольку вы изменили только копию их данных в массиве frames[].

Чтобы изменить это, вам нужно использовать массив указателей на struct can_frame:

struct can_frame *frames[2];
frames[0] = &frame;
frames[1] = &frame2;
....
struct can_frame* to_change = frames[change_frame];
to_change->data[update_index] = anotherRandomNumber;
0 голосов
/ 30 октября 2018

Судя по вашей информации, у вас неправильные ожидания:

Однако значение в исходном кадре не изменяется.

То, что вы показываете нам, это:

Сначала вы подготовите структуру для кадра CAN:

struct can_frame frame2;
frame2.can_id =  0x124;
frame2.can_dlc = 8;
frame2.data[0] = 0x00;
...

Затем вы помещаете эту структуру в массив:

struct can_frame frames[2];
frames[0] = frame;
frames[1] = frame2;

Это делается путем копирования содержимого вашей структуры в массив. Нет обратной ссылки на область памяти, откуда пришли ваши данные.

Затем вы меняете скопированные данные:

struct can_frame* to_change = &(frames[change_frame]);
...
to_change->data[somewhatRandomNumber] = anotherRandomNumber;

Теперь вы ожидаете, что оригинальный кадр изменится. Это не произойдет. После копирования данных из одного местоположения в другое местоположение (что происходит в назначении) у вас есть 2 абсолютно независимых местоположения с одинаковым содержимым. Если вы меняете одно место, другое место не затрагивается.

Если вы хотите изменить frame2, вы должны изменить frame2 напрямую. Это оставит вашу копию в массиве нетронутой. Возможно, вам придется изменить оба места.

Вы также можете изменить свой массив, чтобы он содержал указатели на исходные структуры. Тогда у вас есть только одно местоположение с данными.

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