Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何修复无法将参数从void*[n]转换为const void**_C++ - Fatal编程技术网

C++ 如何修复无法将参数从void*[n]转换为const void**

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

这来自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=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;