我想知道是否有办法让以下代码正常工作,或者我是否必须为固定大小创建该函数的新副本?如果是这样,我怎样才能有一个固定大小的通用函数。
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...
。
如果编译器支持可变长度数组,那么你可以像这样定义函数
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);
如果您无法使用可变长度数组,并且您的函数将接受不同维度的矩阵,那么您的函数将必须将其视为一维数组,并手动进行数学计算以计算开始的位置每行都是。像这样的东西:
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);
只是另一个带有模板的解决方案
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;
}