【问题标题】:Passing Matrix as pointer to function将矩阵作为函数指针传递
【发布时间】:2012-11-03 17:46:51
【问题描述】:

在我的项目中,我有这些文件:

functions.h
functions.cc
main.cc

我正在尝试以这种方式将 Matrix 作为指针传递给函数:

ma​​in.cc

// Size -> const short Size = 10;
int mtr1[Size][Size];
matrix_insert((int *)mtr1);

functions.h

void matrix_insert(int *mtr);

functions.cc

void matrix_insert(int *mtr) {
  short i, j;

  for (i = 0; i < Size; i++) {
    for (j = 0; j < Size; j++) {
      std::cin >> *(mtr + i * Size + j);
    }
  }
}

这确实有效,但我不喜欢这种方式...
有没有更好的方法?

谢谢!

编辑: 可以用向量模拟矩阵吗?

【问题讨论】:

  • 这看起来相当 C-ish。请改用矩阵类。
  • 是的,我知道我可以在课堂上做到这一点,但这是学校的家庭作业。
  • 在 C 中,数组大小是编译时的事情,而数组语法只是让编译器进行乘法运算。如果您想要比第一个答案更花哨的东西,您应该使矩阵成为具有行数和列数以及指向数据的指针的结构。在 C++ 中,您可以在结构中添加辅助方法,在纯 C 中,它们必须是以结构或指向结构的指针作为参数的函数。

标签: c++ function pointers matrix


【解决方案1】:

如果你真的想使用C数组,那么你可以这样做:

ma​​in.cc

int mtr1[Size][Size];
matrix_insert(mtr1);

functions.h

const short Size = 10;
void matrix_insert(int mtr[Size][Size]);

functions.cc

void matrix_insert(int mtr[Size][Size]) {
  short i, j;

  for (i = 0; i < Size; i++) {
    for (j = 0; j < Size; j++) {
      std::cin >> mtr[i][j];
    }
  }
}

工作版本:http://ideone.com/1ik7T9

【讨论】:

  • 但是通过这种方式我创建了另一个矩阵(除了 main.cc 中的那个),我错了吗?
  • @Edoardo:你错了。上面的函数声明与void matrix_insert(int (*mtr)[Size]);完全相同,意思是“一个函数接收一个指向数组大小为Sizeints 的数组的指针并返回void”。
  • @Edoardo 在 C 和 C++ 中,数组作为指针传递,因此不会发生复制。
  • 我可以省略第一个尺寸吗?示例: int mtr[][Size]
  • @Edoardo:是的。 T p[][n]T (*p)[n]T p[m][n] 都是等价的(作为函数参数)。
【解决方案2】:

创建一个像这样的矩阵类:

http://www.parashift.com/c++-faq/matrix-subscript-op.html

【讨论】:

    【解决方案3】:

    您可以使用模板来做到这一点:

    template<int Size>
    void matrix_insert(int (&mtr)[Size][Size])
    {
        short i, j;
    
        for (i = 0; i < Size; i++)
        {
            for (j = 0; j < Size; j++)
            {
                std::cin >> mtr[i][j];
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2021-10-05
      • 2010-12-22
      • 2020-03-19
      • 2020-11-08
      • 2013-09-10
      相关资源
      最近更新 更多