传递矩阵作为参数

时间:2016-02-22 08:25:42

标签: c arrays function multidimensional-array

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

  1. 将矩阵作为参数传递

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

    2016-02-22 14:38:59 {"login_id":123,"login_email":"abc@gmail.com"}
    

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

3 个答案:

答案 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;
}