2015-12-27 291 views
1

[这是一个常见的C/C++问题,不看在GST和G类型]指针指向数组的指针

我有一个指针数组与2项:

GstElement *videoconvert, *audioconvert; 

GstElement *convert_array[2]; 
convert_array[0] = videoconvert; 
convert_array[1] = audioconvert; 

这将在回调函数传递:

g_signal_connect(decodebin, "pad-added", G_CALLBACK(on_pad_added), convert_array); 

后“垫添加”我的信号回调函数将接收该指针(convert_array),为gpointer类型:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data); 

在此回调,我需要从gpointer数据中提取我的GstElements,这是我的失败尝试:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) { 
    GstElement videoelem = ((GstElement *)data)[0]; 
    GstElement audioelem = ((GstElement *)data)[1]; 
... 
} 

我怎样才能做到这一点?

+1

“指向具有2个项目的数组的指针”与2个指针的数组不一样... – Jarod42

+0

@ Jarod42是的,我的错。它没有被看到,但是这是一个指向2个指针的数组的指针。 UPD –

+1

回调函数中的gpointer'data'参数(即convert_array)是* not * GstElement *。这是一个GstElement **。试试'GstElement * videoelem =((GstElement **)data)[0]'。更好的是,对于C++,使用reinterpret_cast (数据)而不是旧的C风格强制转换。 – arayq2

回答

4

data需要投射到GstElement**而不是GstElement*。请记住,convert_array衰减到GstElement**,不GstElement*当你在该行使用它:

g_signal_connect(decodebin, "pad-added", G_CALLBACK(on_pad_added), convert_array); 

因此,你需要使用:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) { 
    GstElement* videoelem = ((GstElement **)data)[0]; 
    GstElement* audioelem = ((GstElement **)data)[1]; 
    ... 
} 
+0

当然所有的作品!非常感谢! :) –

+0

@ user2656632,欢迎您。 –

2
void on_pad_added(GstElement *element, GstPad *pad, gpointer data) { 
    GstElement videoelem = ((GstElement *)data)[0]; 
    GstElement audioelem = ((GstElement *)data)[1]; 
    ... 
} 

如果您gpointer实际上是与GstElement **类型相同,则函数中的GstElements应为指针类型:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) { 
    GstElement* videoelem = ((GstElement **)data)[0]; 
    GstElement* audioelem = ((GstElement **)data)[1]; 
... 
}