在此之前,感谢所有正在阅读此主题的人。非常感谢。
在我在大学的一个编程主题的最后一个项目中,我被告知编写一个使用单个矩阵的程序,具有以下"限制":
用户输入年份(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;
}
我的疑问在于我可以在这个特定的项目中做些什么来动态分配矩阵。我可以使用上面指定的分配形式还是需要使用其他形式?
答案 0 :(得分:0)
是的,你可以使用完全相同的分配方式,但只有你现在想要使用int
元素而不是双倍。
步骤将正是
获得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
另外一点是代替碎片式内存,你可以做到这一点,以获得一个2d数组而不是锯齿状数组。
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 指出了这些细节并提出了另一种实现分配方式的范围