传递矩阵作为参数

我是c的新手,我正在使用CUDA编译器。 我想声明五个矩阵,从[1] [1]到[5] [5]。 用随机值初始化它们。 打印这些值。 我已经展示了我写的全部代码。 我遇到了问题

  1. 传递矩阵作为参数

  2. 初始化矩阵(应该是常量)

    #include  #include  void printMatrix(int **a, int rows, int cols) { for(int i=0; i<rows; i++){ for (int j=0; j<cols; j++){ printf("%d\t", a[i][j] ); } printf("\n"); } } int main() { int N; for (int n=0; n<=5; n++) N = n; int a[N][N]; for(int i=0; i<N; i++) for (int j=0; j<N; j++){ a[i][j] = rand() % 256; } printf("Matrix A\n"); printMatrix(a, 10, 10); } } 

    如果我在顶部定义N,这可以正常工作。 如果我这样做,我无法使用for循环更改N值。 我怎么能纠正

对于初学者来说,该计划中存在拼写错误。 你在循环语句后省略了open大括号

 for (int n=0; n<=5; n++) ^^^^ N = n; int a[N][N]; //... 

应该有

 for (int n=0; n<=5; n++) { ^^^^ N = n; int a[N][N]; //... 

数组a是可变长度数组。 它的维度可能不等于0.因此,变量n必须从1开始,因为它在赋值中写入

 for (int n=1; n<=5; n++) { ^^^^ 

这个函数调用

 printMatrix(a, 10, 10); ^^ ^^ 

没有意义,因为数字10与数组没有任何共同之处。

和function声明

 void printMatrix(int **a, int rows, int cols); ^^^^^^^ 

是无效的。 参数类型和参数类型之间存在不匹配,并且没有从一种类型到另一种类型的隐式转换。

程序看起来像

 #include  #include  #include  void printMatrix( size_t rows, size_t cols, int a[][cols] ) { for ( size_t i = 0; i < rows; i++ ) { for ( size_t j = 0; j < cols; j++ ) printf( "%3d ", a[i][j] ); printf( "\n" ); } } int main( void ) { const size_t N = 5; const int UPPER_VALUE = 256; srand( ( unsigned int )time( NULL ) ); for ( size_t n = 1; n <= N; n++ ) { int a[n][n]; for ( size_t i = 0; i < n; i++ ) { for ( size_t j = 0; j < n; j++ ) a[i][j] = rand() % UPPER_VALUE; } printf( "Matrix A[%zu][%zu]:\n", n, n ); printMatrix( n, n, a ); printf( "\n" ); } return 0; } 

它的输出可能是

 Matrix A[1][1]: 117 Matrix A[2][2]: 57 216 50 233 Matrix A[3][3]: 42 117 215 177 218 26 202 81 163 Matrix A[4][4]: 205 178 157 2 229 165 93 94 91 160 39 205 26 242 131 69 Matrix A[5][5]: 147 248 126 107 42 103 149 160 62 70 122 89 17 203 252 222 125 154 224 98 63 61 192 155 222 

如果编译器不支持可变长度数组,则必须动态分配数组。 例如

 #include  #include  #include  void printMatrix( int **a, size_t rows, size_t cols ) { for ( size_t i = 0; i < rows; i++ ) { for ( size_t j = 0; j < cols; j++ ) printf( "%3d ", a[i][j] ); printf( "\n" ); } } int main( void ) { const size_t N = 5; const int UPPER_VALUE = 256; srand( ( unsigned int )time( NULL ) ); for ( size_t n = 1; n <= N; n++ ) { int **a = malloc( n * sizeof( int * ) ); for ( size_t i = 0; i < n; i++ ) { a[i] = malloc( n * sizeof( int ) ); for ( size_t j = 0; j < n; j++ ) a[i][j] = rand() % UPPER_VALUE; } printf( "Matrix A[%zu][%zu]:\n", n, n ); printMatrix( a, n, n ); printf( "\n" ); for ( size_t i = 0; i < n; i++ ) free( a[i] ); free( a ); } return 0; } 
 for (int n=0; n<=5; n++){ /* <--missing { which causes N to be 6 after last iteration */ //your code } 

你错过了一个{在第一次for循环之后,这就是为什么int a[N][N]和其他循环不在它的体内( 你可能想要“改变 N的

似乎矩阵的数量是不变的,所以只需#define它在顶部。 在不触及printMatrix方法的情况下,您可以使用如下主体:

 #define N 5 int main(int argc, char ** argv) { int **data[N]; // Array of length N of int **, where each int ** will store a matrix. for (int i = 0; i < N; i++) { int matrixSize = i + 1; // creating the ith matrix data[i] = malloc(matrixSize * sizeof *data[i]); for (int j = 0; j < matrixSize; j++) { data[i][j] = malloc(matrixSize * sizeof *data[i][j]); for (int k = 0; k < matrixSize; k++) { data[i][j][k] = rand() % 256; } } } // Printing the first one printMatrix(data[0], 1, 1); // don't forget to loop again to free the buffers allocated... return 0; }