宏可以用于访问动态数组或矢量中的元素或将值分配给这些元素吗?

时间:2018-09-12 06:28:51

标签: c++

我编写了一个小代码,隔离了我在使用宏访问std :: vector元素中的值或为其赋值时所犯的错误方法/理解。下面是代码段。

#define mat(i,j,nrows) mat[((j)*(nrows))+(i)]


struct _STR1
{
 int nRows, nCols;
 std::vector < double >mat;
 std::vector < double >anothermat;
};

void Create_Data (int &nC, _STR1 * &_str)
{
 _str = new _STR1[nC];

 for (int myid = 0; myid < nC; myid++)
 {
  _str[myid].nRows = 100;
  _str[myid].nCols = 3;

  _str[myid].mat.resize (_str[myid].nRows * _str[myid].nCols);

  _str[myid].anothermat.resize (_str[myid].nRows * _str[myid].nCols);

  for (int i_row = 0; i_row < _str[myid].nRows; i_row++)
    {
      _str[myid].mat (i_row, 0, _str[myid].nRows) = 1.0e0;

      _str[myid].mat (i_row, 1, _str[myid].nRows) = 1.0e0;

      _str[myid].mat (i_row, 2, _str[myid].nRows) = 1.0e0;

      _str[myid].anothermat (i_row, 2, _str[myid].nRows) = 1.0e0;
    }
 }
}

如果我评论“ _str [myid] .anothermat(i_row,2,_str [myid] .nRows)= 1.0e0;”,则不会出现任何错误。否则会出现以下错误

error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type

我认为我对使用宏的理解是错误的,但我无法理解为什么是这样。

任何人都可以告诉我为什么这种方法是错误的,为什么我在一种情况下有错误,而另一种情况没有。我对宏的用法正确吗?

1 个答案:

答案 0 :(得分:0)

尽管您的方法是非常规的,但在第一个矩阵的情况下,从技术上来说并不是错误的。在第二个矩阵的情况下,您根本没有为其编写宏,因此anothermat (i_row, 2, _str[myid].nRows)不会转换为任何东西,并且由于它本身不是有效的C ++,因此无法构建您的程序。 / p>

schorsch312的答案显示了一种更好的方法(尽管有错别字);碰巧,我昨天才写了something similar