[英]Using dynamic memory allocation to construct a specific matrix
首先,感谢正在阅读本主题的任何人。 非常感谢。
在我大学的编程课程的最后一个项目中,有人告诉我编写一个使用单个矩阵的程序,并带有以下“限制”:
用户输入年份间隔(example: 2017-2020)
,它将使用以下公式确定矩阵的行数:
NumberOfLines=(FinalYearGiven - InicialYearGiven) + 1;
矩阵的固定列号必须为6。
去年,我被指示去做一个程序,将两个输入矩阵相乘,其分配如下:
double** multiplication_of_2_matrices(double **A, double **B, int lines1, int columns1, int lines2, int columns2)
{
int i, j, k;
double **C; // Pointer to the resultant matrix, dynamically allocating the matrix in this function
C = (double**)malloc(lines1 * sizeof(double*));
for (i = 0; i<lines1; i++)
C[i] = (double*)malloc(columns2 * sizeof(double));
for (i = 0; i < lines1; i++)
{
for (j = 0; j < columns2; j++)
{
C[i][j] = 0.0;
for (k = 0; k < columns1; k++)
{
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
我的疑问在于我可以在这个特定项目中做什么以动态分配矩阵。 我可以使用上面指定的分配形式还是需要使用其他形式?
是的,您可以使用完全相同的分配方式,但是唯一的事情是您现在将要使用int
元素而不是double。
步骤将是精确的
获得numberOfLines
您将分配动态锯齿状数组。
同时做两件事
malloc
的返回值。 没必要 free
动态分配的内存。 unsigned int **c = malloc(sizeof *a*numberOfLines); if (c == NULL){ fprintf(stderr,"Error in allocation"); exit(1); } for(size_t i = 0; i< numberOfLines; i++){ c[i] = malloc(sizeof *a[i]*NUMCOLS); if( c[i] == NULL){ fprintf(stderr,"Error in allocation"); exit(1); } } ... return c;
对像6
这样的常数使用幻数。 #define NUMCOLS 6
。 (不是强制性的-您也可以将其作为某些参数传递)。 只要确保它不会意外更改即可。
我在这里使用了unsigned
,因为您要存储的数据都不会为负。
指出了很少的修改$
由于unsigned int
的大小可能会因系统而异(unsigned int至少具有32位是不正确的),因此最好使用此小技巧来确保最大大小的类型。
#if sizeof(unsigned int) < 4
typedef unsigned long mydata;
#else
typedef unsigned int mydata;
#endif
还有一点是,您可以执行此操作以获取二维数组而不是锯齿状数组,而不是零散的内存。
mydata (*a)[NUMCOLS] = malloc(sizeof *a*numberOfLines);
if (a == NULL){
fprintf(stderr,"Error in allocation");
exit(1);
}
...
return a;
您也可以用另一种方法来完成,即一次分配全部元素的总数。 然后相应地访问职位。
mydata *a = malloc(sizeof *a * NUMCOLS * numberOfLines);
if (a == NULL){
fprintf(stderr,"Error in allocation");
exit(1);
}
..
..
//accessing a[i][j] will be i*NUMCOLS+j
$ PeterJ_01指出了这些细节,并提出了另一种实现分配的方式的范围
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.