我在c ++中有以下功能
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 :(得分:3)
这里的问题是您使用的是left_edge
,就好像它是list
或vector
之类的容器,它只是double *
,即指向double
的指针,或者可能(可能是来自混淆的地方)double
的数组。即使它是后者,也不能以这种方式添加元素,数组的长度是固定的。最后,你必须“记住”每个数组的长度,因为C ++不会为你做那个。
扩展数组的方法是:
因此,例如,假设您使用一个元素 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<>
。
希望这有帮助。
答案 1 :(得分:1)
push_back
是std :: vector类的方法。您应该考虑使用std::vector<double>
代替。如果您使用double*
,则必须这样做:
left_egde[index] = signal_x[i] ;
index++ ;
正确初始化索引。这比std :: vector安全性低,因为在声明
时需要分配足够的内存double *left_edge = new double[whatever_lenght] ;