不能取值对象 - C++
Cant take value object - C++
我在获取 "p1.media" 的值时遇到问题。值是 media: 6.91026e-310 并且必须像 1000、5000...。我尝试了太多的解决方案,但任何人都有效。这是代码:
Code of Calculos.h
#ifndef CALCULOS_H
#define CALCULOS_H
//includes
#define N 100
using namespace std;
class Calculos {
public:
Calculos(double T[], int op);
Calculos(double T[], int op, double media);
Calculos(); //constructor por defecto
void run();
int op;
double desvtipica, media, *T;
};
#endif
Code of Calculos.cpp
//includes
#include "Calculos.h"
using namespace std;
Calculos::Calculos(double T[], int op) {
this->T = T;
this->op = op;
desvtipica = 0.0;
};
Calculos::Calculos() {
}
Calculos::Calculos(double T[], int op, double media) {
this->T = T;
this->op = op;
this->media=media;
};
void Calculos::run() {
if(op == 1) { //calcular media
double suma = 0.0;
for(int i = 0; i < N; i++) {
suma = suma + T[i];
}
media = (double)(suma/N);
}
else { //op=3 calcular desviacion tipica
desvtipica = 3.0; //partially
}
};
Code of Ejercicio.cpp
//includes
#include "Calculos.h"
#include <iostream>
#include <cstdlib>
#include <thread>
using namespace std;
double fRand(double fMin, double fMax)
{
double f = (double)rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
};
int main() {
cout << "#datos: " << N << endl;
double T[N];
for(int i = 0 ; i < N; i++) {
T[i] = fRand(1.0, 1000.0);
}
thread P[2];
Calculos p1(T, 1);
P[0] = thread(&Calculos::run, p1);
P[0].join();
double m = p1.media; // Here is the problem. p1.media return bad values
cout << "media: " << m << endl;
Calculos p3(T, 3, m);
P[1] = thread(&Calculos::run, p3);
P[1].join();
cout << "Fin\n";
return 0;
}
您将参数传递给 thread
构造函数的方式存在问题。
变化:
P[0] = thread(&Calculos::run, p1); // creates a copy of p1
至:
P[0] = thread(&Calculos::run, std::ref(p1)); // pass p1 by reference
现在输出是:
#datos: 100
media: 547.278
Fin
Notes
The arguments to the thread function are moved or copied by value.
If a reference argument needs to be passed to the thread function,
it has to be wrapped (e.g. with std::ref
or std::cref
).
Source: http://en.cppreference.com/w/cpp/thread/thread/thread
(emphasis mine)
在您的代码中,p1.media
是 0
,因为您没有对其进行任何操作。
您已经使用了 p1
.
的临时副本
问题是您使用了 std::thread
的构造函数。看它的第三个定义here。 P[0] = thread(&Calculos::run, p1);
行正在创建 p1
的 copy,然后对其进行操作。尝试使用简单的引用捕获:
P[0] = thread([&p1](){ p1.run(); });
或者,我相信你也可以尝试像这样传入 p1
的地址:
P[0] = thread(&Calculos::run, &p1);
我知道该语法适用于 std::bind
,但我不确定 std::thread
。
我在获取 "p1.media" 的值时遇到问题。值是 media: 6.91026e-310 并且必须像 1000、5000...。我尝试了太多的解决方案,但任何人都有效。这是代码:
Code of Calculos.h
#ifndef CALCULOS_H
#define CALCULOS_H
//includes
#define N 100
using namespace std;
class Calculos {
public:
Calculos(double T[], int op);
Calculos(double T[], int op, double media);
Calculos(); //constructor por defecto
void run();
int op;
double desvtipica, media, *T;
};
#endif
Code of Calculos.cpp
//includes
#include "Calculos.h"
using namespace std;
Calculos::Calculos(double T[], int op) {
this->T = T;
this->op = op;
desvtipica = 0.0;
};
Calculos::Calculos() {
}
Calculos::Calculos(double T[], int op, double media) {
this->T = T;
this->op = op;
this->media=media;
};
void Calculos::run() {
if(op == 1) { //calcular media
double suma = 0.0;
for(int i = 0; i < N; i++) {
suma = suma + T[i];
}
media = (double)(suma/N);
}
else { //op=3 calcular desviacion tipica
desvtipica = 3.0; //partially
}
};
Code of Ejercicio.cpp
//includes
#include "Calculos.h"
#include <iostream>
#include <cstdlib>
#include <thread>
using namespace std;
double fRand(double fMin, double fMax)
{
double f = (double)rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
};
int main() {
cout << "#datos: " << N << endl;
double T[N];
for(int i = 0 ; i < N; i++) {
T[i] = fRand(1.0, 1000.0);
}
thread P[2];
Calculos p1(T, 1);
P[0] = thread(&Calculos::run, p1);
P[0].join();
double m = p1.media; // Here is the problem. p1.media return bad values
cout << "media: " << m << endl;
Calculos p3(T, 3, m);
P[1] = thread(&Calculos::run, p3);
P[1].join();
cout << "Fin\n";
return 0;
}
您将参数传递给 thread
构造函数的方式存在问题。
变化:
P[0] = thread(&Calculos::run, p1); // creates a copy of p1
至:
P[0] = thread(&Calculos::run, std::ref(p1)); // pass p1 by reference
现在输出是:
#datos: 100
media: 547.278
Fin
Notes
The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with
std::ref
orstd::cref
).Source: http://en.cppreference.com/w/cpp/thread/thread/thread (emphasis mine)
在您的代码中,p1.media
是 0
,因为您没有对其进行任何操作。
您已经使用了 p1
.
问题是您使用了 std::thread
的构造函数。看它的第三个定义here。 P[0] = thread(&Calculos::run, p1);
行正在创建 p1
的 copy,然后对其进行操作。尝试使用简单的引用捕获:
P[0] = thread([&p1](){ p1.run(); });
或者,我相信你也可以尝试像这样传入 p1
的地址:
P[0] = thread(&Calculos::run, &p1);
我知道该语法适用于 std::bind
,但我不确定 std::thread
。