将std::vector移交给带指针的函数

Handing over std::vector to function with pointer

本文关键字:指针 函数 std vector      更新时间:2023-10-16

我已经在这个论坛的谷歌上搜索了一段时间,但我找不到任何关于我的问题的答案或提示。教程也帮不了我。。。

我想重新分配一些点,存储在向量p_org中。(x值存储为双值)。因此,我有数学中定义的函数distribute。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的值。如果我尝试使用*,编译器会抱怨:错误:没有运算符"<<"与这些操作数匹配操作数类型为:std::basic_stream><lt;std::vector>std::cout<lt;"开头的控件:p_org:"<lt;(*p_org)<lt;"p_new:"<lt;(*p_new)<lt;"n_points:"<lt;n_点<lt;"s_begin:"<lt;s_begin<lt;"s_end:"<lt;s_end<lt;"total_length:"<lt;total_ length<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]);
                             ^

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

您的编译器错误问题可以归结为一个非常简单的程序。

#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);
}