传递矩阵作为参数
我是c的新手,我正在使用CUDA编译器。 我想声明五个矩阵,从[1] [1]到[5] [5]。 用随机值初始化它们。 打印这些值。 我已经展示了我写的全部代码。 我遇到了问题
-
传递矩阵作为参数
-
初始化矩阵(应该是常量)
#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; }