【问题标题】:function orders in C++C++中的函数顺序
【发布时间】:2020-08-03 22:55:17
【问题描述】:

我是 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 完全相同,只是函数名不同,这一次,两个函数都能正常工作。

我真的很困惑,有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您是否尝试使用调试器调试代码?
  • 旁白:i &lt;= DIS_R.size() - 1 更常见的是 i &lt; DIS_R.size()
  • 旁白:而不是两个元素vector&lt;float&gt;,为什么不是struct point { float x; float y; float angle() const; float distance() const; };?
  • 你想在这里做什么?我认为您正试图找到一定角度或幅度范围内的所有点

标签: c++ function c++11 vector


【解决方案1】:

你的程序有undefined behaviour,因为(最初,当k == 0)你试图

data.erase(data.begin() - 1);

当你尝试i == DIS_R.size() - 1 时再次

DIS_R[i+1]

为什么在迭代 data 时要删除元素?这将导致只访问一半的元素

【讨论】:

  • 嗯,可能是原因之一。
  • 您能更详细地解释一下吗?未定义的行为是什么意思?
  • 未定义行为意味着允许编译器用 anything 替换您的程序
  • 我删除了erase 然后代码工作。我想删除的原因是一旦我知道它们在哪个单元格中,我希望摆脱这些点。
【解决方案2】:

您正在修改函数内部的矢量数据,但您已将其作为按值传递。相反,您应该将它作为 按引用传递

传递给函数

Check this out。 我猜这可以正常工作。

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

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(); i++){
       for (int k = 0; k < data.size(); k++){
           angle = abs(atan( data[k][1] / data[k][0]));
           cout<<"angle: "<<angle<<"\n";
           if ( (angle > DIS_THETA[i]) && (angle <= DIS_THETA[i+1]) ){
               pieced_disc[i].push_back(data[k]);
               data.erase(data.begin() + k);
           } 
       }
   }
   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(); i++){
       for (int k = 0; k < data.size(); 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);
           }
       }
   }
   return ringed_disc[r_loc];
}


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

    for(int j = 0; j < ringd.size(); j++){
        for(int i = 0; i < 2; i++){
        cout << ringd[j][i] << " ";
        }
        cout << "next" << endl;
        return 0;
    }
}

【讨论】:

  • 也许他们希望对 data 的副本进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2016-04-20
相关资源
最近更新 更多