2016-06-24 33 views
-2

我在C++如何使用的push_back双*指针

void LocatePulseEdges(int points, double* signal_x, double* signal_y, double* derivative, double threshold, double* left_edge, double* right_edge){ 
    for (int i=0; i<points; i++){ 
     if(signal_y[i]<threshold){ 
      left_edge.push_back(signal_x[i]); 
     } 
    } 
} 

当我编译它,我得到的错误

In function ‘void LocatePulseEdges(int, double*, double*, double*, double, double*, double*)’: 
error: request for member ‘push_back’ in ‘left_edge’, which is of non-class type ‘double*’ 

由于我是新手下面的函数在C++和我显然,试图了解指针和如何使用它们,我不明白为什么我不能使用push_back

我还试图用(*left_edge)(*signal_y[i])但预计它不是正确的......

任何想法或帮助将是更受欢迎!

编辑

我修改了代码如下

void LocatePulseEdges(int points, double* signal_x, double* signal_y, double* derivative, double threshold, vector<double> left_edge, vector<double> right_edge){ 
    for (int i=0; i<points; i++){ 
     if(signal_y[i]<threshold){ 
      left_edge.push_back(signal_x[i]); 
     } 
    } 
} 

然后在我的代码,我这样调用

void Analyze(unsigned int first_run, unsigned int last_run, unsigned int last_segment){ 
    double* x   = new double[points];   // SIZE limited only by OS/Hardware 
    double* y   = new double[points]; 
    double* derivative = new double[points]; 
    std::vector<double> left_edge; 
    std::vector<double> right_edge; 

    Function_to_Fill_X_and_Y_and_derivative(); 

    LocatePulseEdges(points, x, y, derivative, -0.5*RMS, left_edge, right_edge); 


} 

功能。虽然我没有得到任何编译错误,程序一旦函数被调用就会崩溃。

+0

'double *'是内建类型,它没有任何成员。你可能想要像'left_edge [any_index] = signal_x [i];'。 – songyuanyao

+1

'left_edge'不是一个容器。 –

+0

@songyuanyao:感谢您的评论!问题是'signal_x.Size()'是相当大的(即〜1e7),因此我想使用'push_back'来节省内存空间。 – Thanos

回答

3

的时候,这里的问题是,你正在使用left_edge就好像它是一个容器,如listvector,它是只是一个double *,即指向double的指针,或者可能(可能这是来自混淆的地方)double的数组。即使它是后者,也不能以这种方式添加元素,数组的长度是固定的。最后,你必须“记住”每个数组的长度,因为C++不会为你做到这一点。

扩大数组的方式是:

  1. 新分配更多的空间,
  2. 从旧空间的值复制,
  3. 并添加新的值到新的空间。

因此,举例来说,假设你有一个元素X创建数组:

double * left_edge; 
int length = 1; 
left_edge = new double[ length ]; 
left_edge[ 0 ] = x; 

然后,你需要更多的空间,一个新的元素X

double * new_space = new double[ length + 1 ]; 

for (int i = 0; i < length; ++i) { 
    new_space[ i ] = left_edge[ i ]; 
} 

new_space[ length ] = x; 
++length; 
delete[] left_edge; 
left_edge = new_space; 

这正是std::vector<double>会为你打电话push_back()。唯一的是你必须从头开始定义它,并将它作为参考传递给函数LocatePulseEdges

std::vector<double> left_edge; 

如果你打算在最后加上,那么std::vector<>就是答案。如果你要插入中间,那么你应该选择std::list<>

希望这会有所帮助。

+0

谢谢你的回答!我试图按照你所描述的来定义它,但是我的程序压碎了,尽管我没有编译错误!请检查我编辑的问题。 – Thanos

1

push_back是一个std :: vector类的方法。您应该考虑使用std::vector<double>来代替。如果你使用double*,你必须这样做:

left_egde[index] = signal_x[i] ; 
index++ ; 

索引已正确初始化。这比标准::向量不太安全,因为你需要分配足够的内存,宣布

double *left_edge = new double[whatever_lenght] ;