我有一个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;
但是,原始帧中的值不变。我需要做些什么来改变原始值而不是副本的值?
答案 0 :(得分:1)
根据您的信息,您似乎有错误的期望:
但是,原始帧中的值不变。
您给我们看的是这个
首先,为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
。这将使阵列中的副本保持不变。您可能需要同时更改两个地方。
您还可以更改数组以保存指向原始结构的指针。这样一来,您只能拥有一个位置的数据。
答案 1 :(得分:1)
我不得不对您想要的内容进行一些猜测,因此不确定是否会这样,但是请告诉我...
在线
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[]
数组中它们的数据的 copy
要更改此设置,您需要使用指向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;