我试图通过引用将变量传递给void
指针以更新原始值。当我尝试它时,旧值永远不会更新。任何帮助将不胜感激。
gst_filter_chain
就像主要功能(Gstreamer
)
void update_value(void *oldValue, void *newValue)
{
oldValue = newValue;
}
void update_struct(myStruct *oldStruct, myStruct newStruct)
{
update_value((void *)&oldStruct->a, (void *)&newStruct.a)
}
static GstFlowReturn
gst_filter_chain (GstPad * pad, GstBuffer * buf)
{
GstFilter *filter= GST_FILTER (gst_pad_get_parent (pad));
myStruct temp_data;
int buf_size = GST_BUFFER_SIZE(buf);
if(buf_size > 1) //if buffer is not empty
{
if(!filter->is_init)
{
memcpy(&filter->data, GST_BUFFER_DATA(buf), sizeof(myStruct));
filter->is_init = TRUE;
}
else
{
memcpy(&temp_data, GST_BUFFER_DATA(buf), sizeof(myStruct));
update_struct(&filter->data, temp_data);
}
}
gst_buffer_unref(buf);
return GST_FLOW_OK;
}
答案 0 :(得分:5)
void update_value(void *oldValue, void *newValue)
{
oldValue = newValue;
}
在此代码段中,您只更新指针变量,而不是它指向的值。 您必须取消引用指针才能访问实际数据。如果你想要一个非常通用的setter解决方案,你可以使用memcpy,但你需要传递给update_value一个size参数,告诉memcpy oldValue和newValue指向的数据类型的大小。
void update_value(void *oldValue, void *newValue, size_t dataSize)
{
memcpy(oldValue, newValue, dataSize);
}
答案 1 :(得分:3)
我没有读完整个代码,但是这个函数什么也没做:
void update_value(void *oldValue, void *newValue)
{
oldValue = newValue;
}
oldValue
和newValue
都是保存内存地址的局部变量。由于局部变量被删除,因此在函数退出时会丢失赋值效果。
<强>更新强>
您可能希望使用oldStruct
更新a
的字段newStrcut
。然后你的函数update_struct
看起来像
void update_struct(myStruct *oldStruct, myStruct newStruct)
{
oldStruct->a = newStruct.a;
}
由于oldStruct
是指向结构的指针,存在于某处,因此赋值会影响它。
很遗憾,我不知道a
成员的类型。
更新2
此外,您也可以通过指针发送第二个结构来节省处理时间:
void update_struct(myStruct *oldStruct, myStruct *newStruct)
{
oldStruct->a = newStruct->a;
}