从兼容的指针类型传递

问题描述 投票:0回答:2

我想检查数独行是否有效。因此,为了做到这一点我采取这一行的所有值的总和,并检查它是否等于一定量。我写了一个函数,它在两个参数:二维数组列表,以及特定行我要检查。这是我的功能:

void row_check(int ** array, int x)
{
    int total = 0;
    for(int i = 0; i < 9; i++)
        total = total + array[x][i];

    if (total != 45)
        printf("Row is invalid!\n");
    else
        printf("Row is valid\n");
}

这是我的main()

int main()
{
    grill g2;
    init(g2);
    g2[6][1] = 5; // here we modify the value on row 6              
    row_check(g2, 6);
    display_sudoku(g2);
    return 0;
}

我希望得到一个消息,告诉我,我要检查该行是否是有效还是无效,而是,我得到以下

sudoku.c:56:15: warning: passing argument 1 of 'row_check' from incompatible pointer type [-Wincompatible-pointer-types]
     row_check(g2, 6);
               ^~
sudoku.c:25:6: note: expected 'int **' but argument is of type 'int (*)[9]'
 void row_check(int ** array, int x)
      ^~~~~~~~~

这是我的完整方案:

#include <stdio.h>

typedef int grill[9][9];


void init(grill g)
{
    grill gg =  {{1, 2, 3, 4, 5, 6, 7, 8, 9},
                 {4, 5, 6, 7, 8, 9, 1, 2, 3},
                 {7, 8, 9, 1, 2, 3, 4, 5, 6},
                 {2, 3, 1, 5, 6, 4, 8, 9, 7},
                 {5, 6, 4, 8, 9, 7, 2, 3, 1},
                 {8, 9, 7, 2, 3, 1, 5, 6, 4},
                 {3, 1, 2, 6, 4, 5, 9, 7, 8},
                 {6, 4, 5, 9, 7, 8, 3, 1, 2},
                 {9, 7, 8, 3, 1, 2, 6, 4, 5}};
    int i, j;
    for (i = 0; i < 9; i++)
        for (j = 0; j < 9; j++)
            g[i][j] = gg[i][j];
    return;
}


void row_check(int ** array, int x)
{
    int total = 0;
    for(int i = 0; i < 9; i++)
        total = total + array[x][i];

    if (total != 45)
        printf("Row is invalid!\n");
    else
        printf("Row is valid\n");
}

void display_sudoku(grill g)
{
    printf("\n\t%d %d %d   %d %d %d   %d %d %d\n", g[0][0], g[0][1], g[0][2], g[0][3], g[0][4], g[0][5], g[0][6], g[0][7], g[0][8]);
    printf("\t%d %d %d   %d %d %d   %d %d %d\n", g[1][0], g[1][1], g[1][2], g[1][3], g[1][4], g[1][5], g[1][6], g[1][7], g[1][8]);
    printf("\t%d %d %d   %d %d %d   %d %d %d\n", g[2][0], g[2][1], g[2][2], g[2][3], g[2][4], g[2][5], g[2][6], g[2][7], g[2][8]);
    printf("\n\t%d %d %d   %d %d %d   %d %d %d\n", g[3][0], g[3][1], g[3][2], g[3][3], g[3][4], g[3][5], g[3][6], g[3][7], g[3][8]);
    printf("\t%d %d %d   %d %d %d   %d %d %d\n", g[4][0], g[4][1], g[4][2], g[4][3], g[4][4], g[4][5], g[4][6], g[4][7], g[4][8]);
    printf("\t%d %d %d   %d %d %d   %d %d %d\n", g[5][0], g[5][1], g[5][2], g[5][3], g[5][4], g[5][5], g[5][6], g[5][7], g[5][8]);
    printf("\n\t%d %d %d   %d %d %d   %d %d %d\n", g[6][0], g[6][1], g[6][2], g[6][3], g[6][4], g[6][5], g[6][6], g[6][7], g[6][8]);
    printf("\t%d %d %d   %d %d %d   %d %d %d\n", g[7][0], g[7][1], g[7][2], g[7][3], g[7][4], g[7][5], g[7][6], g[7][7], g[7][8]);
    printf("\t%d %d %d   %d %d %d   %d %d %d\n\n", g[8][0], g[8][1], g[8][2], g[8][3], g[8][4], g[8][5], g[8][6], g[8][7], g[8][8]);
    return;
}

int main()
{
    grill g2;
    init(g2);
    g2[6][1] = 5; // here we modify the value on row 6              
    row_check(g2, 6);
    display_sudoku(g2);
    return 0;
}

如何查看我行是否有效还是无效

c arrays pointers
2个回答
0
投票

当一个阵列被在表达式中使用,它衰变为一个指向它的第一个元素。然而,这仅适用于一个多维阵列的最外尺寸。

类型grill被定义为int [9][9]。这是尺寸9,其成员是类型int,即int [9]的尺寸9的阵列阵列。这样的指针类型int [9][9]的数组的元素是int (*)[9],不int **

更改row_check采取型grill的参数。


0
投票

这是一个警告,而不是一个编译错误。警告可能会导致运行时错误。

你是通过与第二尺寸大小的二维数组固定9.但是,你的功能row_check希望接收任何二维数组与大小没有限制。这就是编译器说。

© www.soinside.com 2019 - 2024. All rights reserved.