C:将矩阵传递给函数的所有可能方法,以及关于argc和argv的一些信息
自从几天以来,我遇到了一些多重编译错误,在底部,我最大的错误是一个,您可以在下面的代码中看到C:将矩阵传递给函数的所有可能方法,以及关于argc和argv的一些信息,c,pointers,matrix,argv,argc,C,Pointers,Matrix,Argv,Argc,自从几天以来,我遇到了一些多重编译错误,在底部,我最大的错误是一个,您可以在下面的代码中看到 #include <stdio.h> #include <stdlib.h> #include <time.h> void generateMatrix(int rows, int cols, int matr[][]); void show(int rows, int cols, int matr[][]); // void analize(int matr[ro
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void generateMatrix(int rows, int cols, int matr[][]);
void show(int rows, int cols, int matr[][]);
// void analize(int matr[rows][cols], int rows, int cols);
int main(int argc, char* argv[])
{
srand(time(NULL));
if(argc < 3)
{
printf("Not enough inputed arguments, you have to insert only two number, one for rows the last for cols\n");
return 1;
}
else
{
int rows = atoi(argv[1]), cols = atoi(argv[2]);
int mat[rows][cols];
generateMatrix(rows, cols, mat);
show(rows, cols, mat);
// analize(mat, rows, cols);
return 0;
}
}
void generateMatrix(int rows, int cols, int matr[][])
{
for(int i=0; i<rows; i++)
for(int j=0; j<cols; j++)
matr[i][j] = rand() % 20;
}
void show(int rows, int cols, int matr[][])
{
for(int i=0; i<rows; i++)
{
for(int j=0; j<cols; j++)
printf("%5d", matr[i][j]);
printf("\n");
}
}
好的,现在回答问题:
感谢花费的时间和将来的答案。编译器无法将
int matr[][]
作为函数参数处理
解决此问题的最简单方法是将其作为int*matr
传递。您可以按如下方式取消引用:matr[i*cols+j]
。由于行的主要顺序,这将以正确的顺序访问它。要消除编译器警告,您需要通过键入&matr[0][0]
来传递它。大多数程序员不会依赖于多维数组的已定义顺序,而是继续将其声明为单个维度
const
是指通过引用某个东西而不能将其写入的方式。所以,是的,您可以声明变量const。它不会破坏任何东西。请注意,当您定义一个常量时,必须将其赋值给它,这正是您想要做的。您遗漏了分配或传递可变维度矩阵的最简单方法-使用:
请注意,返回类型是void*
,因此没有类型安全性
这将以更安全的方式分配数组
void allocateArray( size_t x, size_t y, int ( **array )[x][y] )
{
*array = malloc( sizeof( **array ) );
return( array );
}
您可以使用此表单处理矩阵:
void printMatrix( size_t x, size_t y, int array[x][y] )
{
for ( size_t ii = 0; ii < x; ii++ )
{
char *separator = "";
for ( size_t jj = 0; jj < y; jj++ )
{
printf( "%s%d", sep, array[ ii ][ jj ] );
separator = ", ";
}
printf( "\n" );
}
}
void打印矩阵(大小x,大小y,整数数组[x][y])
{
对于(尺寸ii=0;ii
VLA确实需要符合C99的编译器。在C11中,VLA是可选的,但不支持VLA的一致性C11编译器必须定义\uuuuu STDC\u NO\u VLA\uuuuu请阅读。请不要发布指向文本图像的链接。您的帖子需要包含构建错误/日志的文本内容。请一次发布一个问题。您需要做的第一件事是修复生成错误。最好将错误文本复制/粘贴到问题中。不要张贴文字图片。相反,在你的问题中加入由`
包围的文本,将其格式化为固定文本。我做了,现在好了吗?
void allocateArray( size_t x, size_t y, int ( **array )[x][y] )
{
*array = malloc( sizeof( **array ) );
return( array );
}
void printMatrix( size_t x, size_t y, int array[x][y] )
{
for ( size_t ii = 0; ii < x; ii++ )
{
char *separator = "";
for ( size_t jj = 0; jj < y; jj++ )
{
printf( "%s%d", sep, array[ ii ][ jj ] );
separator = ", ";
}
printf( "\n" );
}
}