繁体   English   中英

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

[英]Using dynamic memory allocation to construct a specific matrix

首先,感谢正在阅读本主题的任何人。 非常感谢。

在我大学的编程课程的最后一个项目中,有人告诉我编写一个使用单个矩阵的程序,并带有以下“限制”:

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

    NumberOfLines=(FinalYearGiven - InicialYearGiven) + 1;

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

  3. 每行的第一列将显示年份。
  4. 2号将显示2月的天数。
  5. 第三天将显示一年中的天数。
  6. 第4位将显示一年中的小时数。
  7. 第五位将显示一年中的分钟数。
  8. 第六位将显示一年中的秒数。

去年,我被指示去做一个程序,将两个输入矩阵相乘,其分配如下:

 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您将分配动态锯齿状数组。

  • 同时做两件事

    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

还有一点是,您可以执行此操作以获取二维数组而不是锯齿状数组,而不是零散的内存。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM