指针类型数组与指针不兼容

时间:2016-08-20 14:43:54

标签: c arrays pointers

我的指针类型有问题。 GCC编译器发出如下警告:

416:31: warning: passing argument 1 of 'locateInHWNDArray' from 
    incompatible pointer type [-Wincompatible-pointer-types]
         locateInHWNDArray(hWndLWTxt, (HWND)lParam, &x, &y);
                           ^
foodplaner.c:76:6: note: expected 'struct HWND__ ***'
but argument is of type 'struct HWND__ * (*)[4]'
void locateInHWNDArray(HWND **array, HWND el, int *x, int *y);
     ^

函数签名如下所示:

void locateInHWNDArray(HWND **array, HWND el, int *x, int *y)

并且呼叫如下

locateInHWNDArray(hWndTWTxt, (HWND)lParam, &x, &y);

将hWndTwTxt声明为

HWND hWndTWTxt[7][4];

我认为这必须做一些事情,让它以一定的大小声明,但我不知道编译器究竟想要什么。

3 个答案:

答案 0 :(得分:2)

HWND **数组需要一个指针数组,而不是2D数组。您可以将其声明为:

HWND* hWndTWTxt[n]

然后必须单独在数组中创建每个指针。

有关更多解释,请参阅此答案:

https://stackoverflow.com/a/16724679/6726446

答案 1 :(得分:2)

问题是二维数组和指针指针不是一回事。

  

foodplaner.c:76:6:注意:预计'struct HWND__ ***'   但参数的类型为'struct HWND__ *(*)[4]'

此错误消息的第一部分(在“but”之前)仅表示HWND等同于HWND__ *(其中HWND__是包含在头文件中的类型在你的项目中。)

错误消息的第二部分(在“but”之后)告诉您hWndTwTxt作为指向4 HWND__ *数组的指针传递。这是一致的 - 维度[7][4]的2D数组作为指向4元素数组的指针传递。

组合使用时,错误消息告诉您无法将2D数组转换为指向指针的指针。

假设您的函数需要传递类似于2D数组的东西,那么您需要将函数指定为

void locateInHWNDArray(HWND array[7][4], HWND el, int *x, int *y)

void locateInHWNDArray(HWND (*array)[4], HWND el, int *x, int *y)

其中任何一个都依赖于编译时已知的第二个(最右侧)维度(即4)。无论哪种方式,该函数必须使用有效的数组索引(即,当使用array[i][j]执行某些操作时,i必须介于07之间且j之间必须介于0之间4HWND **)。

如果你真的想要传递一个HWND **temp; int i, j; temp = malloc(7*sizeof(*temp)); for (i = 0; i < 7; ++i) { temp[i] = malloc(4*sizeof(*temp[i])); for (j = 0; j < 4; ++j) temp[i][j] = hWndTWText[i][j]; } locateInHWNDArray(temp, (HWND)lParam, &x, &y); /* copy from temp back to `hWndTWText` if the function modifies elements */ for (int i = 0; i < 7; ++i) free(temp[i]); free(temp); (即不改变函数参数类型)那么你需要做这样的事情

Route::get('/{camp}/session/{session}/athlete/{athlete}/category/{category}/type/{type}', 'AthleteController@chart');

该函数仍然需要确保索引有效(如果数组维度在编译时没有修复,则意味着它们必须以某种方式传递给函数 - 例如,作为附加参数)。

答案 2 :(得分:0)

Here is what you need

简而言之,您需要将维数作为指针传递,但由于您有一个静态数组(并且静态二维数组需要第二级指针为const指向静态数组的指针),这将工作:

void locateInHWNDArray(HWND array[7][4], HWND el, int *x, int *y)

或使用链接答案中列出的任何方式。