我一直在谷歌搜索这个论坛一段时间,但我找不到任何答案或提示我的问题。教程也无法帮助我......
我想重新分配一些点,存储在矢量p_org中。 (x值存储为double)。 因此我有函数distribute,它在maths.h
中定义distribute_tanh(&p_org_temp,&p_new_temp,iz,spacing[0],spacing[1],l_rot[(kk+1)*iz-2],status);
distribute_tanh函数看起来像这样:
inline void distribute_tanh (std::vector<double> *p_org, std::vector<double> *p_new, const int n_points, double spacing_begin, double spacing_end, const double total_length, double status){
//if status == 0: FLAP, if status == 1: SLAT
std::cout << "spacing_begin: " << spacing_begin << " spacing_end: " << spacing_end << std::endl;
double s_begin = spacing_begin / total_length;
double s_end = spacing_end / total_length;
double A = sqrt(s_end/s_begin);
double B = 1 / (sqrt(s_end*s_begin)*n_points);
std::cout << "A: " << A << " B: " << B << std::endl;
std::vector<double> u (n_points);
std::vector<double> sn (n_points);
double dx;
double dy;
std::cout << "Control at the beginning: p_org: " << (p_org) << " p_new: " << (p_new) << " n_points: " << n_points << " s_begin: " << s_begin << " s_end: " << s_end << " total_length: " << total_length << std::endl;
//问题没有。 1
for (int i=0;i<n_points;i++){
if (B > 1.001) {
if (B < 2.7829681) {
double Bq=B-1;
dy=sqrt(6*Bq)*(1-0.15*Bq+0.057321429*pow(Bq,2)-0.024907295*pow(Bq,3)+0.0077424461*pow(Bq,4)-0.0010794123*pow(Bq,5));
} else if (B > 2.7829681) {
double Bv=log(B);
double Bw=1/B-0.028527431;
dy=Bv+(1+1/Bv)*log(2*Bv)-0.02041793+0.24902722*Bw+1.9496443*pow(Bw,2)-2.6294547*pow(Bw,3)+8.56795911*pow(Bw,4);
}
u[i]=0.5+(tanh(dy*(i*(1.0/n_points)-0.5))/(2*tanh(dy/2)));
}
else if (B < 0.999) {
if (B < 0.26938972) {
dx=M_PI*(1-B+pow(B,2)-(1+(pow(M_PI,2))/6)*pow(B,3)+6.794732*pow(B,4)-13.205501*pow(B,5)+11.726095*pow(B,6));
} else if (B > 0.26938972) {
double Bq=1-B;
dx=sqrt(6*Bq)*(1+0.15*Bq+0.057321429*pow(Bq,2)+0.048774238*pow(Bq,3)-0.053337753*pow(Bq,4)+0.075845134*pow(Bq,5));
}
u[i]=0.5+(tan(dx*(i*(1.0/n_points)-0.5))/(2*tan(dx/2)));
}
else {
u[i]=i*(1.0/n_points)*(1+2*(B-1)*(i*(1.0/n_points)-0.5)*(1-i*(1.0/n_points)));
}
sn[i]=u[i]/(A+(1.0-A)*u[i]);
std::cout << "sn(i): " << sn[i] << std::endl;
std::cout << "p_org[n_points]: " << &p_org[n_points-1] << std::endl;
if(status==0){
//p_new[i]=p_org[0]+(total_length*sn[i]);
std::cout << "FLAP maths.h" << std::endl;
}
//Here is the problem no. 2
else if(status==1){
//p_new[i]=p_org[0]-(total_length*sn[i]);
std::cout << "SLAT maths.h" << std::endl;
}
//std::cout << "p_new in math: " << p_new << std::endl;
}
}
我的问题是,我无法访问p_org或p_new的值。一开始我想说出p_org和p_new的价值。如果我用*尝试它,编译器就会抱怨:错误:没有操作符&#34;&lt;&lt;&#34;匹配这些操作数 操作数类型是:std :: basic_ostream&gt; &LT;&LT;的std ::矢量&GT; std :: cout&lt;&lt; &#34;开头控制:p_org:&#34; &LT;&LT; (* p_org)&lt;&lt; &#34; p_new:&#34; &LT;&LT; (* p_new)&lt;&lt; &#34; n_points:&#34; &LT;&LT; n_points&lt;&lt; &#34; s_begin:&#34; &LT;&LT; s_begin&lt;&lt; &#34; s_end:&#34; &LT;&LT; s_end&lt;&lt; &#34; total_length:&#34; &LT;&LT; total_length&lt;&lt;的std :: ENDL;
如果我离开*,我会得到p_org和p_new的地址。
在代码的最后,我想将新值写入p_new。如果我使用*来访问该值,编译器就会抱怨,如果我将其关闭,它也会抱怨以下消息:
error: no operator "-" matches these operands
operand types are: std::vector<double, std::allocator<double>> - double
p_new[i]=p_org[0]-(total_length*sn[i]);
^
我试图理解这两个问题,但直到现在我都没有成功。 谢谢你的建议。
答案 0 :(得分:1)
编译错误的问题可以简化为一个非常简单的程序。
#include <vector>
void foo(std::vector<int>* pV)
{
pV[0] = 10; // error.
}
int main()
{
std::vector<int> v(10);
foo(&v);
}
问题是operator[]
如上所述适用于对象和引用,而不是指针。由于pv
是指针,因此必须首先取消引用它以获取对象,然后将[]
应用于解除引用的指针。
void foo(std::vector<int>* pV)
{
(*pV)[0] = 10; // No error
}
也可以使用另一种形式的调用operator[]
,但有点冗长:
void foo(std::vector<int>* pV)
{
pv->operator[](0) = 10; // No error
}
然而,为了减轻必须这样做,通过引用传递向量。然后可以使用operator[]
的“正常”方式。
#include <vector>
void foo(std::vector<int>& pV)
{
pV[0] = 10; // No error.
}
int main()
{
std::vector<int> v(10);
foo(v);
}