我正在尝试学习如何使用TBB,因此我正在修改一个示例程序,我发现它旨在计算复数数组的幂。最初,它将一个数组传递给parallel_for循环,但我试图改变它以便它传递给一个向量。但是,我无法编译代码;我收到以下错误(使用g ++ -g program_name.cpp -ltbb编译):
error: passing ‘const std::complex<double>’ as ‘this’ argument
discards qualifiers [-fpermissive] result[i] = z;
我的代码如下:
#include <cstdlib>
#include <cmath>
#include <complex>
#include <ctime>
#include <iostream>
#include <iomanip>
#include "tbb/tbb.h"
#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"
#include "tbb/parallel_for_each.h"
#include "tbb/task_scheduler_init.h"
using namespace std;
using namespace tbb;
typedef complex<double> dcmplx;
dcmplx random_dcmplx ( void )
{
double e = 2*M_PI*((double) rand())/RAND_MAX;
dcmplx c(cos(e),sin(e));
return c;
}
class ComputePowers
{
vector<dcmplx> c; // numbers on input
int d; // degree
vector<dcmplx> result; // output
public:
ComputePowers(vector<dcmplx> x, int deg, vector<dcmplx> y): c(x), d(deg), result(y) { }
void operator() ( const blocked_range<size_t>& r ) const
{
for(int i=r.begin(); i!=r.end(); ++i)
{
dcmplx z(1.0,0.0);
for(int j=0; j < d; j++) {
z = z*c[i];
};
result[i] = z;
}
}
};
int main ( int argc, char *argv[] )
{
int deg = 100;
int dim = 10;
vector<dcmplx> r;
for(int i=0; i<dim; i++)
r.push_back(random_dcmplx());
vector<dcmplx> s(dim);
task_scheduler_init init(task_scheduler_init::automatic);
parallel_for(blocked_range<size_t>(0,dim),
ComputePowers(r,deg,s));
for(int i=0; i<dim; i++)
cout << scientific << setprecision(4)
<< "x[" << i << "] = ( " << s[i].real()
<< " , " << s[i].imag() << ")\n";
return 0;
}
答案 0 :(得分:1)
您正在尝试修改mutable
中的非result
成员字段const
- 合格operator()
。
解决这种差异。
编辑#1:我已经提到了上面的两个关键字。之一:
从const
移除operator()
限定符:
void operator() ( const blocked_range<size_t>& r ) { ... }
制作result
mutable
:
mutable vector<dcmplx> result;
在申请(尽管强烈偏好)变种号后,可能会出现其他错误。 1.第2号仅用于完整性,仅用于marginal situations。
确实会导致第一个变体出错。这是因为tbb::parallel_for
需要Func
const&
,因此它只能在您的仿函数上调用const
- 合格的成员函数。为什么? TBB并不想通过复制大型仿函数来浪费性能(STL通过值传递它们)。
我不知道这里常见的做法是什么,我从未使用过这个库。
编辑#2:您可能遗失的只是result
不是参考:
vector<dcmplx> &result;
现在,即使在const
- 合格operator()
中,您也可以对其进行修改。修改后来被破坏的成员是没有意义的。
请勿忘记更改构造函数的签名,以便通过引用传递y
。
代码中的主题问题:
未包含<vector>
标题
using namespace bulky_namespace
在size_t
循环
i
使用for
或许更多......