使用动态内存分配来构造特定的矩阵

时间:2017-11-21 09:13:29

标签: c

在此之前,感谢所有正在阅读此主题的人。非常感谢。

在我在大学的一个编程主题的最后一个项目中,我被告知编写一个使用单个矩阵的程序,具有以下"限制":

  1. 用户输入年份(example: 2017-2020)的间隔,它将使用以下公式确定矩阵的行数:

    NumberOfLines=(FinalYearGiven - InicialYearGiven) + 1;

  2. 矩阵的固定列号必须为6.

  3. 每行的第一列将显示年份。
  4. 第二个将显示二月份的天数。
  5. 第3天将显示一年中的天数。
  6. 第4天将显示一年中的小时数。
  7. 第五个将显示一年中的分钟数。
  8. 第6天将显示当年的秒数。
  9. 去年我被指示做一个多个两个输入矩阵的程序,其分配如下:

     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;
        }
    

    我的疑问在于我可以在这个特定的项目中做些什么来动态分配矩阵。我可以使用上面指定的分配形式还是需要使用其他形式?

1 个答案:

答案 0 :(得分:0)

是的,你可以使用完全相同的分配方式,但只有你现在想要使用int元素而不是双倍。

步骤将正是

  • 获得numberOfLines后,您将分配动态锯齿状数组。

  • 在做这两件事时

    1. 不要转换malloc的返回值。这是不必要的。
    2. 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 指出了这些细节并提出了另一种实现分配方式的范围