如何解决gcc编译器中的警告
我要编写一个对矩阵进行卷积的程序,但是首先我需要创建此矩阵并使用随机数加载它,但是在执行此操作的方法中,我收到了警告,并且由于我是新手,所以无法解决此问题。这个,这会让我发疯
#include <stdio.h>
#include <stdlib.h>
#define ROW 5
#define COL 5
// Create a Matrix
int **generateMatrix(int row,int col){
int **mat;
mat=(int**)malloc(sizeof(int*)*row);
for(int i=0;i<row;i++){
mat[i]=(int*)malloc(sizeof(int)*col);
}
if(mat==NULL){
printf("Insufficient Memory...");
return 0;
}
return mat;
}
// Load a Matrix
int loadMatrix(int *x[][COL],int row,int col){
int i;
for(int r=0;r<row;r++){
for(int c=0;c<col;c++){
x[r][c]=rand()%256;
}
}
return x;
}
// Print a Matrix
void printMatrix(int *x[][COL],int col){
for(int r=0;r<row;r++){
for(int c=0;c<col;c++){
printf("\t%d",x[r][c]);
}
printf("\n");
}
}
int main(){
int **matrix,**kernel;
// Create the Matrix
matriz=generateMatrix(ROW,COL);
kernel=generateMatrix(3,3);
// Load the Matrix
loadMatrix(matrix,ROW,COL);
loadMatrix(kernel,3,3);
// Print Matrix
printf("Matrix\n");
printMatrix(matrix,COL);
printf("\n");
printf("Kernel\n");
printMatrix(kernel,3);
printf("\n");
free(matrix);
free(kernel);
}
我收到以下警告
main.c:25:20: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
main.c:28:14: warning: return makes integer from pointer without a cast [-Wint-conversion]
main.c:35:22: warning: format ‘%d’ expects argument of type ‘int’,but argument 2 has type ‘int *’ [-Wformat=]
main.c:49:18: warning: passing argument 1 of ‘loadMatrix’ from incompatible pointer type [-Wincompatible-pointer-types]
main.c:21:9: note: expected ‘int * (*)[5]’ but argument is of type ‘int **’
main.c:50:18: warning: passing argument 1 of ‘loadMatrix’ from incompatible pointer type [-Wincompatible-pointer-types]
main.c:21:9: note: expected ‘int * (*)[5]’ but argument is of type ‘int **’
main.c:54:19: warning: passing argument 1 of ‘printMatrix’ from incompatible pointer type [-Wincompatible-pointer-types]
main.c:32:10: note: expected ‘int * (*)[5]’ but argument is of type ‘int **’
main.c:58:19: warning: passing argument 1 of ‘printMatrix’ from incompatible pointer type [-Wincompatible-pointer-types]
main.c:32:10: note: expected ‘int * (*)[5]’ but argument is of type ‘int **’
解决方法
我相信您必须考虑如何构建矩阵事物。
假设我们正在谈论一个5x5的int数组
- 计划A:
int kernel[][]
我们将有一个起始地址kernel
和5 x 5 x sizeof(int)
值,例如,使用32位编译器,从4个字节到总共100个字节。这样,您将声明为int kernel[5][5]
。而kernel[0]
是int[5]
- 计划B:
int** kernel
从kernel
开始,我们将int
作为指向*kernel
的指针数组的指针。这是另一种动物。 kernel
指向具有指向int
的指针的区域。假设我们也有5个。 kernel
然后指向5个指向int
的指针的区域。不是int
的数组。仅5 int
。为了使每个指向5个int
的数组,我们应该将kernel
声明为int* kernel[5];
,在这种情况下,*kernel[0]
到*kernel[4]
的确会指向到5 int
的数组。
但是请注意,我们无法知道*kernel
中有多少个指针。
这就是将main()
声明为int main(int argc,char** argv);
的原因:有人必须告诉程序*argv
中有多少个指针。
返回您的代码:
您必须在generateMatriz()
和loadMatriz()
中使用此知识。
要使用数组表示法,最后一个维度必须恒定。但是请查看loadMatriz()
int loadMatriz(int* x[][COL],int row,int col);
这里x
是什么?不是计划A。不是计划B。x
是指向int
的指针和数组。 x
的每个元素都是指向int
的指针。这不是您在main()
上传递的内容:
int main() {
int** matriz,** kernel;
// Create the Matriz
matriz = generateMatriz(ROW,COL);
kernel = generateMatriz(3,3);
// Load the Matriz
loadMatriz(matriz,ROW,COL);
loadMatriz(kernel,3,3);
kernel
是int**
。不是int*[][]
。考虑一下。这是编译器错误的原因:您必须根据计划构建矩阵;)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。