gpt4 book ai didi

c - 使用动态内存分配构造特定矩阵

转载 作者:行者123 更新时间:2023-11-30 16:38:41 25 4
gpt4 key购买 nike

首先,我要感谢所有阅读本主题的人。非常感谢。

在我大学编程科目的期末项目中,我被告知要编写一个使用单个矩阵的程序,并具有以下“限制”:

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

    NumberOfLines=(FinalYearGiven - InicialYearGiven) + 1;

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

  3. 每行的第一列将显示年份。

  4. 第二个将显示二月的天数。

  5. 第三个将显示一年中的天数。

  6. 第四个将显示一年中的小时数。

  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. 释放动态分配的内存。
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;
  • 对常量使用魔数(Magic Number),例如 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指出了这些细节并建议了另一种实现分配方式的范围

关于c - 使用动态内存分配构造特定矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47409276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com