c++ - C++中的函数顺序
问题描述
我是 C++ 新手。我的程序中有三个函数。第一个与 python 中的 np.linspace 相同。后两者都接受一个二维向量,一个整数并返回一个二维向量。这是我的代码:
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
vector<float> linspace(float start, float end, int step);
vector< vector<float> > angleDisc(vector < vector<float> > data, int theta_loc);
vector< vector<float> > ringDisc(vector < vector<float> > data, int r_loc);
const float R_M = 18, RESO_R = 80;
const float RESO_THETA = 60;
const float PI = 3.14159;
const vector<float> DIS_R = linspace(0, R_M, RESO_R);
const vector<float> DIS_THETA = linspace(0, PI/2, RESO_THETA);
int main() {
vector < vector<float> > inner = {{0.1, 0.000001},{1,-2},{-2,3},{1,3},{6,1},{4,-4},{1,3.2},{4,5.7}};
vector< vector<float> > angled = angleDisc(inner, 0);
//vector< vector<float> > ringd = ringDisc(inner, 0);
for(int j = 0; j < angled.size(); j++){
for(int i = 0; i < 2; i++){
cout << angled[j][i] << " ";
}
cout << "next" << endl;
return 0;
}
vector<float> linspace(float start, float end, int step){
vector<float> stairs;
float increment = (end - start) / step;
for (int i = 0; i <= step; i++){
stairs.push_back(i * increment);
}
return stairs;
}
vector< vector<float> > angleDisc(vector < vector<float> > data, int theta_loc){
vector< vector < vector<float> > > pieced_disc( DIS_THETA.size() );
float angle;
for (int i = 0; i <= DIS_THETA.size() - 1; i++){
for (int k = 0; k <= data.size() - 1; k++){
angle = abs( atan( data[k][1] / data[k][0]));
if ( (angle > DIS_THETA[i]) && (angle <= DIS_THETA[i+1]) ){
pieced_disc[i].push_back(data[k]);
data.erase(data.begin() + k - 1 );
}
}
}
return pieced_disc[theta_loc];
}
vector< vector<float> > ringDisc(vector < vector<float> > data, int r_loc){
vector< vector < vector<float> > > ringed_disc( DIS_R.size() );
float r;
for (int i = 0; i <= DIS_R.size() - 1; i++){
for (int k = 0; k <= data.size() - 1; k++){
r = sqrt(pow(data[k][0], 2) + pow(data[k][1], 2));
if ( (r > DIS_R[i]) && (r < DIS_R[i+1]) ){
ringed_disc[i].push_back(data[k]);
data.erase(data.begin() + k - 1 );
}
}
}
return ringed_disc[r_loc];
}
虽然这很好用,但如果我取消注释:
vector< vector<float> > ringd = ringDisc(inner, 0);
在主函数中。代码仍然可以编译成功,但执行目标文件不会返回任何内容,我必须按“Control + C”退出。
我试过: 1)翻转函数angleDisc()和ringDisc()的顺序,在这种情况下,先行的ringDisc()可以在main函数中打印结果,但角度盘不能。
2) 令ringDisc() 与angleDisc 完全相同,只是函数名不同,此时两个函数都可以正常工作。
我真的很困惑,有人可以帮我解决这个问题吗?
解决方案
您的程序具有未定义的行为,因为(最初,何时k == 0
)您尝试
data.erase(data.begin() - 1);
当i == DIS_R.size() - 1
你再次尝试时
DIS_R[i+1]
为什么data
在迭代它时要从中删除元素?这将导致只访问一半的元素
推荐阅读
- ios - 我如何查看 CloudKit 容器中 Apple ID 帐户而非开发者帐户的数据?
- c - c中的凯撒密码表现出罕见的行为
- java - findById(id) 在第一次遇到时返回 Null,但在使用 findAll() 方法后工作
- r - 想要在传单地图中添加 10 种不同类型的图标
- google-maps - 发生异常。_TypeError(类型'String'不是'index'类型'int'的子类型)
- angular - ngIf 和 ngSwitch 不会替换 IE11 中的 div
- angular - 多个应用程序中的 Angular 共享资产
- javascript - 在 React 中更改函数中的凭据
- php - Laravel mix 不编译 sass
- java - 使用 Firebase 在 Android App 中使用 Spring Boot