[英]How can I receive a void parameter in function definition, C or C++?
[英]How can I create a matrix in a void function and return as parameter C
我必须创建一个矩阵,但有以下要求:
我尝试了什么:
void createMatrix(int n,float** matrix)
{
matrix = (float**)malloc(n * sizeof(float*));
for (int i = 0; i < n; i++)
matrix[i] = (float*)malloc(n* sizeof(float));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
matrix[i][j] = 0;
}
int main()
{
int n;
FILE* fis;
fis = fopen("fileIn.txt", "r");
if (!fis)
{
printf("File not opened");
return;
}
fscanf(fis, "%d", &n);
fclose(fis);
float** matrix;
createMatrix(n, &matrix);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
printf("%f ", matrix[i][j]);
printf("\n");
}
return;
}
如果您将float **
的地址传递给 function,则参数的类型应为float ***
。 因此,在 function 中,将参数类型更改为该参数类型,并在使用矩阵的任何地方使用*matrix
matrix
void createMatrix(int n, float ***matrix)
{
*matrix = malloc(n * sizeof(float*));
for (int i = 0; i < n; i++)
(*matrix)[i] = malloc(n* sizeof(float));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
(*matrix)[i][j] = 0;
}
请注意,转换也已被删除,因为转换malloc
的返回值不是必需的,并且可以掩盖代码中的其他错误。
您还应该在调用malloc
之后添加错误检查。
如果您以这种方式创建矩阵
matrix = (float**)malloc(n * sizeof(float*));
for (int i = 0; i < n; i++)
matrix[i] = (float*)malloc(n* sizeof(float));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
matrix[i][j] = 0;
并希望通过参数返回矩阵,则 function 应声明为
void createMatrix( int n, float ***matrix )
{
*matrix = malloc( n * sizeof( float* ) );
for ( int i = 0; i < n; i++ )
( *matrix )[i] = malloc( n * sizeof( float ) );
for ( int i = 0; i < n; i++ )
{
for ( int j = 0; j < n; j++ )
{
( *matrix )[i][j] = 0;
}
}
}
也就是说,如果您要传递 main 中声明的指针matrix
,例如
float** matrix;
通过指向它的指针引用到 function
createMatrix(n, &matrix);
那么相应的 function 参数将具有float ***
类型。
需要注意的一些事项:
matrix
,而不是从 function 返回,这是一个错误和 memory 泄漏。 如果您可以放弃列出的这些要求,我们可以轻松修复这些错误和设计错误。 然后有一个更好的标准 C function 用于所有这些称为calloc
。
用法:
size_t fx = 5;
size_t fy = 3;
float (*fmat)[fy] = calloc( 1, sizeof(float[fx][fy]) );
...
free(fmat);
这比您的 function快得多,它没有不必要的类型泛型编程,它在连续的 memory 中分配一个真正的二维数组,从而提供数据缓存一致性并将所有数据项设置为零。
您需要按如下方式更改createMatrix
:
void createMatrix(int n,float*** matrix)
{
*matrix = (float**)calloc(n,sizeof(float*));
for (int i = 0; i < n; i++)
*matrix[i] = (float*)calloc(n,sizeof(float));
}
为了让调用者能够看到您创建的矩阵,您必须将指针传递给它......是的,这是一个指向指针的指针。 通过使用calloc
而不是malloc
,可以为您处理初始化为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.