![](/img/trans.png)
[英]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.