【问题标题】:Incompatible pointer type array to pointer不兼容的指针类型数组到指针
【发布时间】:2016-08-20 14:43:53
【问题描述】:

我对指针类型有疑问。 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];

我认为这与以一定大小声明它有关,但我不知道编译器到底想要什么。

【问题讨论】:

    标签: c arrays pointers


    【解决方案1】:

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

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

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

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

    结合起来,错误消息告诉您二维数组无法转换为指向指针的指针。

    假设您的函数需要传递类似于 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 必须介于07j 必须介于04 之间)。

    如果你真的想传递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);
    

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

    【讨论】:

      【解决方案2】:

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

      HWND* hWndTWTxt[n]
      

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

      更多解释请参见此答案:

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

      【讨论】:

        【解决方案3】:

        Here is what you need.

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

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

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

        【讨论】:

        • 为什么这被否决了?使用这个版本,我没有编译错误/警告。
        • @DQQpy 呵呵,不知道。重要的是它对你有用!
        猜你喜欢
        • 2020-10-11
        • 2013-11-06
        • 2020-12-07
        • 1970-01-01
        • 2018-11-23
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多