C++ 如何修复无法将参数从void*[n]转换为const void**
这来自OpenCL教程。我有:C++ 如何修复无法将参数从void*[n]转换为const void**,c++,C++,这来自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, nativeKer
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=clenqueueenativekernel*队列的行中不断收到编译器错误。。。它所说的参数是args_mem_loc
error C2664: 'clEnqueueNativeKernel' : cannot convert parameter 7 from 'void *[2]' to 'const void **'
args_mem_loc是指向一个空指针数组的空指针,它使用的所有变量都是在堆栈上创建的,对吗?我很肯定。那么编译器为什么认为它是空的?[2 ]?< p>当你有一个数组的指针时,比如Vault*AgsSmiMeLoC(2),这意味着你有一个指针指向一个指针数组,而不是另一个指针本身。因此,基本上,您需要使用以下命令将args_mem_loc作为指向指针的指针传入:
&args_mem_loc[0]
或
然后,您将有一个来自void*的指针指向数组每个插槽中的另一个指针。当您有一个指向数组的指针时,例如void*args\u mem\u loc[2],这意味着您有一个指向指针数组的指针,而不是另一个指针本身。因此,基本上,您需要使用以下命令将args_mem_loc作为指向指针的指针传入:
&args_mem_loc[0]
或
然后,将有一个来自void*的指针指向数组每个插槽中的另一个指针。这是:
void* args_mem_loc[2] = {&args[2], &args[3]};
隐式转换为:
void **
不可隐式转换为:
const void **
因为你可以将一个常量void*分配给一个void*并破坏常量的正确性
编译器说args_mem_loc是一个空*[2],因为它就是这样。如果要传递可以隐式转换为const void**的数组,请将args_mem_loc声明为const void*arg_mem_loc[2]={…}
顺便提一下,该函数的const void**参数应该是const void*const*;在这种情况下,隐式转换将起作用。这表明函数不会修改args_mem_loc,因为通过该指针进行赋值是非法的,因此允许隐式转换。这是:
void* args_mem_loc[2] = {&args[2], &args[3]};
隐式转换为:
void **
不可隐式转换为:
const void **
因为你可以将一个常量void*分配给一个void*并破坏常量的正确性
编译器说args_mem_loc是一个空*[2],因为它就是这样。如果要传递可以隐式转换为const void**的数组,请将args_mem_loc声明为const void*arg_mem_loc[2]={…}
顺便提一下,该函数的const void**参数应该是const void*const*;在这种情况下,隐式转换将起作用。这表明函数不会修改args_mem_loc,因为通过该指针进行赋值是非法的,因此可以进行隐式转换。指向数组的指针和指向另一个指针的指针不是一回事。您需要将args_mem_loc作为第二个指针而不是数组。可能我在这里遗漏了一些内容,但是数组T[]衰减为T*,所以void*[]衰减为void**,所以它应该可以工作?&args_mem_loc[0]更接近它,但我仍然得到一个错误,因为它不是常量---无法将参数7从'void**'转换为'const void**'。这里有一个很好的解释:指向数组的指针和指向另一个指针的指针不是一回事。您需要将args_mem_loc作为第二个指针而不是数组。可能我在这里遗漏了一些内容,但是数组T[]衰减为T*,所以void*[]衰减为void**,所以它应该可以工作?&args_mem_loc[0]更接近它,但我仍然得到一个错误,因为它不是常量---无法将参数7从'void**'转换为'const 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=clenqueueenativekernel*queue,nativeKernel,args,4,2,mem_list,&args_mem_loc[0],0,NULL,NULL;最后的答案是:constvoid*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=clenqueueenativekernel*queue,nativeKernel,args,4,2,mem_list,&args_mem_loc[0],0,NULL,NULL;