【问题标题】:How to fix cannot convert parameter from void*[n] to const void** [duplicate]如何修复无法将参数从 void*[n] 转换为 const void** [重复]
【发布时间】:2013-08-21 17:51:00
【问题描述】:

这是来自 OpenCL 教程。我有:

void* args[4] = {(void*)5, (void*)123, NULL, NULL}; 
cl_mem mem_list[2] = {mem_d1, mem_d2}; // mem_d1 and mem_d2 are cl_mem objects
void* args_mem_loc[2] = {&args[2], &args[3]};
status = clEnqueueNativeKernel(*queue, nativeKernel, args, 4, 2, mem_list, args_mem_loc, 0, NULL, NULL); // http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clEnqueueNativeKernel.html

我不断收到编译器错误(在 status = clEnqueueNativeKernel(*queue... 它正在谈论的参数是 args_mem_loc 的行)。

error C2664: 'clEnqueueNativeKernel' : cannot convert parameter 7 from 'void *[2]' to 'const void **'

args_mem_loc 是一个指向 void 指针数组的 void 指针,它使用的所有变量都是在堆栈上创建的(对吗?我很确定)。那么为什么编译器会认为它是 void* [2] 呢?

【问题讨论】:

  • 指向数组的指针和指向另一个指针的指针不是一回事。您需要将 args_mem_loc 作为第二个指针而不是数组。
  • 也许我在这里遗漏了一些东西,但是数组 T[] 衰减到 T*,所以 void*[] 衰减到 void**,所以它应该可以工作?
  • &args_mem_loc[0] 让它更接近,但我仍然收到一个错误,因为它不是恒定的 ----- 无法将参数 7 从 'void **' 转换为 'const void **'
  • 这里的解释很好:c-faq.com/ansi/constmismatch.html

标签: c++


【解决方案1】:

这个:

void* args_mem_loc[2] = {&args[2], &args[3]};

隐式转换为:

void **

不能隐式转换为:

const void **

因为您可以将 const void * 分配给 void * 并破坏 const 正确性。

编译器说args_mem_locvoid *[2],因为它就是这样。如果要传递可以隐式转换为const void ** 的数组,请将args_mem_loc 声明为const void *arg_mem_loc[2]= {...};

顺便说一句,该函数的const void ** 参数应该是const void * const *;在这种情况下,隐式转换将起作用。这表明该函数不会修改args_mem_loc,因为通过该指针分配是非法的,因此允许隐式转换。

【讨论】:

    【解决方案2】:

    当您有一个指向数组的指针时,例如void* args_mem_loc[2],这意味着您有一个指向指针数组的指针,而不是另一个指针本身。所以本质上,您需要使用以下内容将args_mem_loc 作为指向指针的指针传递:

    &args_mem_loc[0]
    

    &args_mem_loc[1]
    

    然后您将有一个指针(来自 void*)指向另一个指针(数组的每个插槽中的内容)。

    【讨论】:

    • 最终的答案是: const void* args[4] = {(void*)5, (void*)123, NULL, NULL}; cl_mem mem_list[2] = {mem_d1, mem_d2}; const void* args_mem_loc[2] = {&args[2], &args[3]}; status = clEnqueueNativeKernel(*queue, nativeKernel, args, 4, 2, mem_list, &args_mem_loc[0], 0, NULL, NULL);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多