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;
}

このスニペットでは、ポインタ変数が指す値ではなく、ポインタ変数のみを更新しています。実際のデータにアクセスするには、ポインターを逆参照する必要があります。本当に汎用的なセッター ソリューションが必要な場合は、memcpy を使用できますが、update_value にサイズ パラメータを渡して、oldValue と newValue が指すデータ型のサイズを memcpy に伝える必要があります。

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おそらく、 'sフィールドaを'sフィールドで更新したいと思うでしょうnewStrcut。次に、関数update_structは次のようになります。

void update_struct(myStruct *oldStruct, myStruct newStruct)
{
    oldStruct->a = newStruct.a;
}

は構造体へのポインタであり、どこかに存在するためoldStruct、割り当てはそれに影響します。

a残念ながら、会員の種類はわかりません。

更新2

また、ポインタで2番目の構造体を送信することで、処理時間を節約できます。

void update_struct(myStruct *oldStruct, myStruct *newStruct)
{
    oldStruct->a = newStruct->a;
}
于 2012-12-05T17:26:59.110 に答える