我的指针类型有问题。 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];
我认为这必须做一些事情,让它以一定的大小声明,但我不知道编译器究竟想要什么。
答案 0 :(得分:2)
HWND **数组需要一个指针数组,而不是2D数组。您可以将其声明为:
HWND* hWndTWTxt[n]
然后必须单独在数组中创建每个指针。
有关更多解释,请参阅此答案:
答案 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
必须介于0
和7
之间且j
之间必须介于0
之间4
和HWND **
)。
如果你真的想要传递一个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)
简而言之,您需要将维数作为指针传递,但由于您有一个静态数组(并且静态二维数组需要第二级指针为const
指向静态数组的指针),这将工作:
void locateInHWNDArray(HWND array[7][4], HWND el, int *x, int *y)
或使用链接答案中列出的任何方式。