将std :: vector移交给指针运行

时间:2014-09-16 09:21:30

标签: c++ stdvector

我一直在谷歌搜索这个论坛一段时间,但我找不到任何答案或提示我的问题。教程也无法帮助我......

我想重新分配一些点,存储在矢量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]);
                             ^

我试图理解这两个问题,但直到现在我都没有成功。 谢谢你的建议。

1 个答案:

答案 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);
}