0

我试图通过引用将变量传递给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;
}
4

2 回答 2

5
void update_value(void *oldValue, void *newValue)
{
    oldValue = newValue;
}

在这个片段中,您只更新指针变量,而不是它指向的值。您必须取消引用指针才能访问实际数据。如果您想要一个真正通用的 setter 解决方案,您可以使用 memcpy,但您需要将 size 参数传递给 update_value,以告诉 memcpy oldValue 和 newValue 指向的数据类型的大小是多少。

void update_value(void *oldValue, void *newValue, size_t dataSize)
{
    memcpy(oldValue, newValue, dataSize);
}
于 2012-12-05T17:28:02.010 回答
3

我没有阅读整个代码,但是这个函数什么都不做:

void update_value(void *oldValue, void *newValue)
{
    oldValue = newValue;
}

oldValue和都是newValue保存内存地址的局部变量。由于删除了局部变量,因此在函数退出时失去了赋值效果。

更新

可能您希望用' 更新oldStruct' 字段。然后你的功能看起来像anewStrcutupdate_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;
}
于 2012-12-05T17:26:59.110 回答