簡體   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