【问题标题】:Warnings in gcc compilergcc 编译器中的警告
【发布时间】:2020-08-11 02:47:07
【问题描述】:

我要编写一个对矩阵进行卷积的程序,但首先我需要创建这个矩阵并用随机数加载它,但是在我的方法中,我收到了警告,我无法解决这个问题,因为我是新手这和这会让我发疯的

#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 row, 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, ROW, COL);
  printf("\n");

  printf("Kernel\n");
  printMatrix(kernel, 3, 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 **’ 

【问题讨论】:

  • int *x[][COL] 应该是 int **x(两个地方)。该参数应与您传递给它的类型匹配(即int **
  • 您对if (mat == NULL) 的检查为时已晚(它应该在循环之前,而不是在循环之后),并且您也不会检查分配每一行是否失败。
  • 请注意,您不应编辑问题以使错误消息不再准确 - 您不会更新问题以包含答案(除非您还保留原始代码并解释修改的原因代码是正确的)。

标签: c pointers casting


【解决方案1】:

我相信你一定要考虑一下你想如何构建矩阵的东西。

假设我们正在讨论一个 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);

kernelint**。它不是int*[][]。想想这个。这是编译器错误的原因:您必须按计划构建矩阵;)

【讨论】:

  • 很高兴知道!是时候计划了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2020-02-16
  • 2022-06-27
  • 2014-05-11
相关资源
最近更新 更多