我是c的新手,我正在使用CUDA编译器。我想声明五个矩阵,从[1] [1]到[5] [5]。用随机值初始化它们。打印这些值。我已经展示了我写的整个代码。我遇到问题
将矩阵作为参数传递
初始化矩阵(应该是常量)
2016-02-22 14:38:59 {"login_id":123,"login_email":"abc@gmail.com"}
如果我在顶部定义N,这可以正常工作。如果我这样做,我无法使用for循环更改N值。我怎样才能纠正。
答案 0 :(得分:1)
对于初学者来说,该计划中存在拼写错误。你在循环语句
之后省略了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与数组没有任何共同之处。
功能声明
void printMatrix(int **a, int rows, int cols);
^^^^^^^
无效。参数类型和参数类型之间不匹配,并且没有从一种类型到另一种类型的隐式转换。
程序看起来像
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
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;
}
答案 1 :(得分:0)
for (int n=0; n<=5; n++){ /* <--missing { which causes N to be 6 after last iteration */
//your code
}
在{
中首次for
循环之后,您错过了main
,其中int a[N][N]
和其他循环不在其正文中(您可能想要&#34;改变 N &#34; 的价值
答案 2 :(得分:-1)
似乎矩阵的数量是不变的,所以只需#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;
}