将固定大小的数组传递给带有指针参数的函数

问题描述 投票:0回答:3

我想知道是否有办法让以下代码正常工作,或者我是否必须为固定大小创建该函数的新副本?如果是这样,我怎样才能有一个固定大小的通用函数。

void prettyPrintMatrix_float(float **matrix, int rows, int cols){
    int i, j;

    for (i = 0; i<rows; i++){
        for (j = 0; j<cols; j++){
            printf("%10.3f", matrix[i][j]);
        }
        printf("\n");
    }
    return;
}

float ppArray[4][10] = {0.0f};
prettyPrintMatrix_float(ppArray, 4, 10);

出现错误

Access violation reading location 0xFFFFF...

c arrays pointers multidimensional-array
3个回答
2
投票

如果编译器支持可变长度数组,那么你可以像这样定义函数

void prettyPrintMatrix_float( int rows, int cols, float matrix[rows][cols] ){
    int i, j;

    for (i = 0; i<rows; i++){
        for (j = 0; j<cols; j++){
            printf("%10.3f", matrix[i][j]);
        }
        printf("\n");
    }
}

否则你可以像这样定义函数

void prettyPrintMatrix_float(const float *matrix, int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("%10.3f", matrix[i * cols + j]);
        }
        putchar('\n');
    }
}

并称其为

prettyPrintMatrix_float( ( const float * )ppArray, 4, 10);

0
投票

如果您无法使用可变长度数组,并且您的函数将接受不同维度的矩阵,那么您的函数将必须将其视为一维数组,并手动进行数学计算以计算开始的位置每行都是。像这样的东西:

void prettyPrintMatrix_float(float *matrix, int rows, int cols){
    int i, j;

    for (i = 0; i<rows; i++){
        for (j = 0; j<cols; j++){
            printf("%10.3f", matrix[i * sizeof(float) + j]);
        }
        printf("\n");
    }
    return;
}

float ppArray[4][10] = {0.0f};
prettyPrintMatrix_float(&ppArray[0][0], 4, 10);

0
投票

只是另一个带有模板的解决方案

template<int rows, int cols>
void prettyPrintMatrix_float(float (&matrix)[rows][cols])
{
    int i, j;
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
        {
            printf("%10.3f", matrix[i,j]);
            // Or
            //printf("%10.3f", matrix[i][j]);
        }
        printf("\n");
    }
    return;
}
© www.soinside.com 2019 - 2024. All rights reserved.