2017-06-22 26 views
0

我试图重新从从代码的另一部分返回C指针一个UserEvent对象:OPENCL:从C风格的指针创建UserEvent

uintptr_t get_event_ptr(); // returns cl_event pointer to user event, comes from pyopencl 


uintptr_t evt_ptr = get_event_ptr(); 

用C活动++具有下面的构造:

Event (const cl_event &event, bool retainObject=false) 

但UserEvents没有这样的构造函数。所有他们需要的是:

UserEvent (const Context &context, cl_int *err=NULL) 
UserEvent() 

我试着做一个静态的演员阵容,重新解释演员和一个动态转换,但没有成功:

dynamic_cast

cl::UserEvent* ue = dynamic_cast<cl::UserEvent*> (new cl::Event(*((const cl_event*) evt_ptr))); 

error: 'cl::Event' is not polymorphic 

static_cast

cl::UserEvent* ue = static_cast<cl::UserEvent*> (new cl::Event(*((const cl_event*) evt_ptr))); 

ue->setStatus(CL_COMPLETE); 

Segmentation fault: 11 

reinterpret_cast

cl::UserEvent* ue = reinterpret_cast<cl::UserEvent*> (new cl::Event(*((const cl_event*) evt_ptr))); 

ue->setStatus(CL_COMPLETE); 

Segmentation fault: 11 

using parent constructor

cl::UserEvent* ue = new cl::UserEvent((const cl_event&)(*((const cl_event*) evt_ptr))); 

error: no matching constructor for initialization of 'cl::UserEvent' 

我怎样才能重新从C指针UserEvent?

回答

0

cl_event是typedef'd作为指针,而不是opencl抽象类型。因此,它应该设置为evt_ptr,而不是* evt_ptr。

cl::UserEvent* ue = static_cast<cl::UserEvent*> (new cl::Event((cl_event) evt_ptr)); 

ue->setStatus(CL_COMPLETE); 

作品就好