【问题标题】:Compiler is warning about nonmatching function declarations involving arrays编译器警告涉及数组的不匹配函数声明
【发布时间】:2011-11-12 06:07:13
【问题描述】:

我正在尝试编写一个接受数组作为参数的函数。但是,C 编译器 (lcc) 发出警告(即我的文件仍在编译)“.\tetris.c:179:警告:`clear_array' 的声明与 .\tetris.c:172 的先前声明不匹配” .

这是我的代码中涉及该函数的部分以及对该函数的调用,该函数引发了警告:

void remove_filled_rows ()
{
    int row;
    for (row = 0; row < NROWS; row++) {
        // [snip] 
        if (col == NCOLS) {
            clear_array (cells[row]);    // line 172
        }
    }

}

/* Helper method that clears a row */
void clear_array (lc4uint row_array[]) {    // line 179
    int col;
    for (col = 0; col < NCOLS; col++) {
        row_array[col] = 0;
    }
}

我的数组声明如下:

lc4uint cells[NROWS][NCOLS];

其中 NROWS 和 NCOLS 是整数常量,lc4uint 只是 unsigned int 的 typedef。

【问题讨论】:

    标签: c arrays


    【解决方案1】:

    声明必须在访问之前。在调用之前将clear_array 移动到它,或者在调用之前为clear_array 函数添加原型。您应该在任何体面的编译器上都收到有关此问题的错误/警告。

    放弃——第 172 行不应该是声明,第 179 行是。但是错误说 172 是声明。

    【讨论】:

    • @GiantMarshmallow gcc 的消息可能更有帮助,它谈到了之前的 implicit 声明。通过在声明之前使用它,您可以隐式声明它(返回类型为 int)。
    【解决方案2】:
    lc4uint cells[NROWS][NCOLS]; // == lc4uint cells[NROWS*NCOLS] 
    

    这样的声明会在内存中生成一个一维数组(尽管您可以使用两个索引访问它),您只能在函数声明中将其引用为:

    fun(lc4uint cells[][NCOLS]);
    

    因为单元格的类型是

    lc4uint *
    

    所以在clear_array (cells[row]); cells[row] 是一个元素,类型为 lc4uint,因此没有匹配的函数声明类型。由于在此之前没有给出任何声明,编译器现在假设: clear_array(lc4uint) 而您对 clear_array(lc4uint *) 感兴趣

    您必须将数组声明更改为类似

    lc4uint **cells = (lc4uint**) calloc(NROWS, sizeof(lc4uint*));
    lc4uint *tmp = (lc4uint *) calloc(NROWS*NCOLS, sizeof(lc4uint))
    for(int i = 0; i < NROWS; i++) cells[i] = &(tmp[i*NCOLS])
    

    否则cells[row] 不会返回指向正确行的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-19
      • 2015-11-26
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多