【问题标题】:How to read a matrix into a double** array that is within a structure? [closed]如何将矩阵读入结构内的双**数组? [关闭]
【发布时间】:2017-10-04 18:00:57
【问题描述】:

我有一个内部有 double** mat 数组的结构,它是一个指向双精度值指针的指针。假设矩阵叫m,我可以用m.mat[i][j]把值放入数组吗?

struct Matrix {
  size_t row;
  size_t col;
  double** mat;
};
typedef struct Matrix TMatrix;

int readMatrix(TMatrix m) {
    for(int i=0; i<m.row; i++)
    {
      for(int j=0; i<m.col; j++)
      {
        if(!scanf("%lg ", (m.mat[i][j])))
           return 0;
      }
    }
   return 1;
}

【问题讨论】:

  • 请不要发布代码图片的链接。编辑问题,并将代码放入问题中。
  • 我的错,第一次在 StackOverflow 上发帖
  • 但是数组不是一个异常,因为它是一个指针数组? 一个数组不是一个指针。数组是一个内存区域。它一个地址,并且在某些情况下使用C代码中的数组衰减到那个地址。指针是一个可以保存地址的变量。再说一遍:数组不是指针。
  • 另外,您应该将m 作为指针传递:int readMatrix(TMatrix* m) ... for(int i=0; i&lt;m-&gt;row; i++) ... if( scanf("%lg", &amp;(m-&gt;mat[i][j])) != 1)。我有点好奇您实际上是如何为该结构分配内存的。
  • 注意:i&lt;m.col -> j&lt;m.col

标签: c arrays matrix structure


【解决方案1】:

你不能用二维数组来做到这一点。

但是,您可以使用指向一维双精度数组的一维指针数组。即使它不是真正的 2D 数组,它也可以在许多方面以与真正的 2D 数组相同的方式使用。

类似:

#include <stdio.h>
#include <stdlib.h>
 
struct Matrix {
  size_t row;
  size_t col;
  double **mat;
};
typedef struct Matrix TMatrix;
 
void initMatrix(TMatrix *m, int row, int col) {
    m->row = row;
    m->col = col;
    int i;
    m->mat = malloc(m->row * sizeof(double*));  // allocate array of double pointers
    for (i=0; i<m->row; ++i)
    {
        m->mat[i] = malloc(m->col * sizeof(double));  // allocate array of doubles
    }
}
 
void freeMatrix(TMatrix m) {
    int i;
    for (i=0; i<m.row; ++i)
    {
        free(m.mat[i]);
    }
    free(m.mat);
}
 
int readMatrix(TMatrix m) {
    for(int i=0; i<m.row; i++)
    {
      for(int j=0; j<m.col; j++)
      {
        if(scanf(" %lg", &m.mat[i][j]) != 1) return 0;
      }
    }
    return 1;
}
 
 
void printMatrix(TMatrix m) {
    for(int i=0; i<m.row; i++)
    {
      for(int j=0; j<m.col; j++)
      {
        printf("%f ", m.mat[i][j]);
      }
      printf("\n");
    }
}
 
 
 
int main(void) {
    TMatrix a;
    initMatrix(&a, 2, 3);
    if (!readMatrix(a))
    {
        printf("input error\n");
        return -1;
    }
    printMatrix(a);
    freeMatrix(a);
 
    return 0;
}

标准输入

1 2 3 4 5 6

标准输出

1.000000 2.000000 3.000000 
4.000000 5.000000 6.000000 

【讨论】:

  • @user3704223 - 你的scanf是错误的。你不应该做if (!scanf(....),而是if (scanf(....) != 1)
  • @user3704223 而不是scanf("%lg scanf(" %lg 注意%lg之前的空格
  • @user3704223 - 我已经更新了从标准输入读取的答案
  • 虽然我发现m-&gt;mat = malloc(sizeof *(m-&gt;mat) * m-&gt;row); 比这个答案行更容易编码、审查和维护,但这是一个很好的回复。特别是对于使用相同维度的 2D 演示。 2,3 很好地说明了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多