【发布时间】:2015-11-15 23:00:03
【问题描述】:
我遇到两种类型的错误:
编译器的抱怨
pr.c:在函数'main'中:
pr.c:20:2:警告:从不兼容传递“printMatrix”的参数 1 指针类型[默认启用]
pr.c:9:6:注意:预期为“const int (*)[80]”,但参数类型为“int (*)[80]”
pr.c:22:2: 警告:从不兼容的指针类型传递“lights”的参数 1 [默认启用]
pr.c:10:6:注意:预期为“const int (*)[80]”,但参数类型为“int (*)[80]”
编译器似乎抱怨在接受 const 的函数中接收非 const,但有人告诉我这是使用 const...的正确方法...
#include <stdio.h>
#include <stdlib.h>
#define MAXCOL 80
#define MAXROW 20
#define randNormalize() srand(time(0))
void fillMatrix(int m[][MAXCOL], size_t rows, size_t cols);
void printMatrix(const int m[][MAXCOL], size_t rows, size_t cols);
void lights(const int m[][MAXCOL], size_t rows, size_t cols);
int star(const int m[][MAXCOL], int row, int col);
int main()
{
int m[MAXROW][MAXCOL];
randNormalize();
fillMatrix(m, 5, 5);
printMatrix(m, 5, 5);
lights(m, 5, 5);
return 0;
}
void fillMatrix(int m[][MAXCOL], size_t rows, size_t cols)
{
int i, j;
for(i = 0; i < rows; i++)
for(j = 0; j < cols; j++)
m[i][j] = rand()%21;
}
void printMatrix(const int m[][MAXCOL], size_t rows, size_t cols)
{
int i, j;
for(i = 0; i < rows; i++)
{
printf("\n");
for(j = 0; j < cols; j++)
printf("%d ", m[i][j]);
}
printf("\n");
}
void lights(const int m[][MAXCOL], size_t rows, size_t cols)
{
int i, j;
for(i = 1; i < rows - 1; i++)
{
printf("\n");
for(j = 1; j < cols - 1; j++)
{
if( star(m, i, j) )
printf("*");
else
printf(" ");
}
}
printf("\n");
}
int star(const int m[][MAXCOL], int row, int col)
{
int i, j;
int sum = 0;
for(i = row - 1; i <= row + 1; i++)
for(j = col - 1 ; j <= col + 1; j++ )
sum += m[i][j];
return (sum/9 > 10);
}
我正在寻找不使用指针的最佳解决方案,因为这是来自我们尚未涵盖它们的课程的练习(尽管我已经研究过它们)。
【问题讨论】:
-
const-thing 很好,但fillMatrix需要一个指向 80 数组ints 的指针,而您传递一个指向 5 数组的指针。这些不兼容。 This question 可能会解释更多。 -
为什么 const 没问题?我想摆脱它:~(。
-
仅供参考,这些消息不是两个单独的警告。它们是同一警告的一部分。
-
怎么回事?它们是关于不同行的消息。
-
哦,好的,我现在看到您为两个警告提供了一半的消息。我的意思是每个警告都应该告诉你警告类型,然后是警告说明。这是您分别显示的内容,但针对不同的警告行。因此,您实际上应该发布警告输出中的所有 4 行,或者至少为每行发布一致的警告消息的相同部分。