繁体   English   中英

如何在 void function 中创建矩阵并作为参数 C 返回

[英]How can I create a matrix in a void function and return as parameter C

我必须创建一个矩阵,但有以下要求:

  • 为它创建一个 function
  • 矩阵必须在 function 内动态分配
  • 矩阵必须作为 function 的参数返回(函数必须为 void)

我尝试了什么:

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 ***类型。

需要注意的一些事项:

  • 您的 function 正在创建指针到指针的查找表,而不是二维数组。 指针对指针查找表仅在我们想要单独大小的项目时才有意义,而在数学方形矩阵中则不然。 所有的指针对指针技巧都是膨胀、访问缓慢和不必要的复杂性。 你绝对不会从中获得任何好处。 详见正确分配多维 arrays
  • 此查找表分配给局部变量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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM