错误:表达式必须是可修改的LVALUE
Error: Expression must be a modifiable lvalue
当我尝试将值分配给x_dev,y_dev和Pearson时,我一直在for循环中出现此错误。据我所知,它们都应该修改。谁能看到我出了什么问题?
class LoopBody
{
double *const x_data;
double *const y_data;
double const x_mean;
double const y_mean;
double x_dev;
double y_dev;
double pearson;
public:
LoopBody(double *x, double *y, double xmean, double ymean, double xdev, double ydev, double pear)
: x_data(x), y_data(y), x_mean(xmean), y_mean(ymean), x_dev(xdev), y_dev(ydev), pearson(pear) {}
void operator() (const blocked_range<size_t> &r) const {
for(size_t i = r.begin(); i != r.end(); i++)
{
double x_temp = x_data[i] - x_mean;
double y_temp = y_data[i] - y_mean;
x_dev += x_temp * x_temp;
y_dev += y_temp * y_temp;
pearson += x_temp * y_temp;
}
}
};
遵循@bathsheba的建议,我已经克服了这些问题。但是,在运行parallel_时运行操作员时,但是从未输入for循环。
这是我称parallel_for的地方:
parallel_for(blocked_range<size_t>(0,n), LoopBody(x, y, x_mean, y_mean, x_dev, y_dev, pearson), auto_partitioner());
()
操作员标记为const
,并且您正在尝试修改类成员数据(例如x_dev
,y_dev
和person
)。这是不允许的,这就是为什么您会遇到编译时间错误。
您可能想从方法中删除const
。
另外,您可以将要修改为mutable
的成员数据标记,但这不是首选解决方案,因为它使代码变脆,难以阅读并且可以用多线程造成破坏。
似乎要减少,即计算数据上的一些聚合值。
为此,TBB提供了一个特殊功能模板:parallel_reduce
。与您现在使用的parallel_for
不同,parallel_reduce
不需要Body类的operator()
为const,因为该类的实例会累积部分结果。但是,它对班级提出了其他要求:需要一个特殊的构造函数以及一种合并另一个身体实例的部分结果的方法。
更多信息可以在Intel(R)TBB用户指南中找到:http://www.threadingbuildingblocks.org/docs/help/tbb_userguide/parallel_reduce.htm
也有parallel_reduce
的过载,它需要两个函子 - 一个用于身体,另一个用于合并部分结果 - 以及用于初始化累加器的特殊"身份"值。但是您正在一次计算三个汇总值,因此您仍然需要一个结构或类以将所有三个值存储在一个变量中。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 对RValue对象调用的LValue ref限定成员函数
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- C ,表达必须是可修改的LVALUE
- 表达式必须是可修改的lvalue:`(x,y)= 0;`
- 将值分配给指针时:表达式必须是可修改的lvalue
- 错误:表达式必须是可修改的LVALUE
- 通过使用模板类,表达式必须是可修改的LVALUE