如何使用 push_back 双*指针
How to use push_back with double* pointer
我在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);
}
虽然我没有编译错误,但程序一调用函数就崩溃了。
push_back
是std::vectorclass的一个方法。您应该考虑改用 std::vector<double>
。如果你使用 double*
,你必须这样做:
left_egde[index] = signal_x[i] ;
index++ ;
索引已正确初始化。这不如 std::vector 安全,因为在声明
时需要分配足够的内存
double *left_edge = new double[whatever_lenght] ;
这里的问题是你在使用 left_edge
就好像它是一个容器,例如 list
或 vector
,而它只是一个 double *
,即,指向 double
的指针,或者(可能这是混淆的来源)double
的数组。即使是后者,也不能那样添加元素,数组的长度是固定的。最后,您必须 "remember" 每个数组的长度,因为 C++ 不会为您这样做。
扩展数组的方法是:
- 分配更多space新的,
- 复制旧 space、
的值
- 并将新值添加到新的 space。
因此,例如,假设您使用一个元素创建数组 x:
double * left_edge;
int length = 1;
left_edge = new double[ length ];
left_edge[ 0 ] = x;
那么你需要更多space,一个新元素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<>
is the answer. If you are going to insert in the middle, then you should choose std::list<>
。
希望这对您有所帮助。
我在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);
}
虽然我没有编译错误,但程序一调用函数就崩溃了。
push_back
是std::vectorclass的一个方法。您应该考虑改用 std::vector<double>
。如果你使用 double*
,你必须这样做:
left_egde[index] = signal_x[i] ;
index++ ;
索引已正确初始化。这不如 std::vector 安全,因为在声明
时需要分配足够的内存double *left_edge = new double[whatever_lenght] ;
这里的问题是你在使用 left_edge
就好像它是一个容器,例如 list
或 vector
,而它只是一个 double *
,即,指向 double
的指针,或者(可能这是混淆的来源)double
的数组。即使是后者,也不能那样添加元素,数组的长度是固定的。最后,您必须 "remember" 每个数组的长度,因为 C++ 不会为您这样做。
扩展数组的方法是:
- 分配更多space新的,
- 复制旧 space、 的值
- 并将新值添加到新的 space。
因此,例如,假设您使用一个元素创建数组 x:
double * left_edge;
int length = 1;
left_edge = new double[ length ];
left_edge[ 0 ] = x;
那么你需要更多space,一个新元素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<>
is the answer. If you are going to insert in the middle, then you should choose std::list<>
。
希望这对您有所帮助。