至于下面的代码:
template<typename PatternType>
cl_int enqueueFillBuffer(
const Buffer& buffer,
PatternType pattern,
::size_t offset,
::size_t size,
const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL) const
{
cl_event tmp;
cl_int err = detail::errHandler(
::clEnqueueFillBuffer(
object_,
buffer(),
static_cast<void*>(&pattern),
sizeof(PatternType),
offset,
size,
(events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(event != NULL) ? &tmp : NULL),
__ENQUEUE_FILL_BUFFER_ERR);
if (event != NULL && err == CL_SUCCESS)
*event = tmp;
return err;
}
如果数组长度 6 是静态指定的,则可以编译代码。
queue.enqueueFillBuffer<float[6]>(buffer, nodes, 2345, 123456);
我的问题是如何使长度6成为变量并传递编译?由于C99支持动态数组,因此sizeof(float [n])可以正确获取大小(代码 sizeof(PatternType))。但我不能让下面的代码通过编译:
int n = 6;
queue.enqueueFillBuffer<float[n]>(buffer, nodes, 2345, 123456);
答案 0 :(得分:2)
考虑使用std::array
。更一般地,假设类似STL的容器将传递给您的方法。例如,
std::array<float, 6> nodes;
nodes[0] = ...
或
std::vector<float> nodes;
nodes.resize(6);
nodes[0] = ...
然后是行
static_cast<void*>(&pattern),
sizeof(PatternType),
可以替换为
static_cast<void*>(pattern.data()),
sizeof(typename PatternType::value_type) * pattern.size(),
编译器可以推断出类型,因此调用该方法只需
queue.enqueueFillBuffer(buffer, nodes, 2345, 123456);
无需显式模板参数。
答案 1 :(得分:0)
答案是无法完成它。 至于enqueueFillBuffer实现,请参考:https://www.khronos.org/bugzilla/show_bug.cgi?id=1347 支持的模式的最大大小是ulong16,128字节。