функциональные заказы в C ++ - PullRequest
0 голосов
/ 21 апреля 2020

Я новичок в C ++. В моей программе три функции. Первый из них работает так же, как np.linspace в python. Последние два принимают двумерный вектор, целое число и возвращают двумерный вектор. Вот мой код:

#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) перевернуть порядок функции angleDis c () и ringDis c (), в данном случае, ringDis c (), который идет первым, может напечатать результат в основной функции, но угол dis c не может.

2) Пусть ringDis c () точно так же, как angleDis c, но отличаются только имена функций, на этот раз обе функции могут работать правильно.

Я действительно смущен, кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Ваша программа имеет неопределенное поведение , потому что (первоначально, когда k == 0) вы пытаетесь

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

и снова, когда i == DIS_R.size() - 1 вы пытаетесь

DIS_R[i+1]

Почему вы удаляете элементы из data, пока выполняете его? Это приведет к посещению только половины элементов

0 голосов
/ 21 апреля 2020

Вы изменяете векторные данные внутри функций, и все же вы передаете их как , передавая значение . Вместо этого вы должны были передать его функции как передать по ссылке

Проверьте это . Это работает правильно, я думаю.

#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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...