是否可以使用宏来访问动态数组或向量中的元素或为其赋值

Can macros be used to access or assign values to elements in dynamic array or vector

本文关键字:向量 赋值 元素 数组 可以使 动态 访问 是否      更新时间:2023-10-16

我写了一个小代码,它隔离了我在使用宏访问或为 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].othermat (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

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

谁能告诉我为什么这种方法是错误的,为什么我在一种情况下有错误,而另一种情况没有。我对宏的用法是否正确?

宏被认为是不好的做法。

请改用函数。它们更不容易出错(例如类型安全(。

可以使用各种技术来获得与 C 宏(如模板函数(相同的性能。

在您的情况下,我将简单地定义一个包装类:

template <typename T>
class Mat {
private:
std::vecotr<T> mat;
int nrows;
public:
Mat(const Matrix & mat, int nrows);
const T& operator()(int i, int j) const {
return mat[j * nrows + i];
}
T& operator()(int i, int j) {
return mat[j * nrows + i];
}
};

虽然你的方法是非常规的,但在第一个矩阵的情况下,它在技术上并没有。在第二个矩阵的情况下,你根本没有为它编写宏,所以anothermat (i_row, 2, _str[myid].nRows)不会转换为任何东西,而且由于它本身C++无效,你的程序无法构建。

schorsch312的回答显示了更好的方法(尽管有错别字(;碰巧的是,我昨天写了类似的东西。