2017-05-30 9 views
-1

ベクトルのC++でget/setメソッドを使用しようとしています。私はstd :: out_of_rangeのインスタンスをスローするエラーを続けています。私はego_points.at(1)のインデックス値を私のメインコードに入れようとします。私は以下の私のヘッダファイルと私のメインのコードを提供していますが、私は、ここで説明しようとするでしょう:get/setメソッドでベクトルを返す

を私は持っているというクラスScanCallbackベクトルscannedDataを構築し、使用していますと呼ばれるパブリック関数とポイントは、プライベートベクトルのtransmitDataと等しいと設定します。scannedData。私のメインのコードでは、私はポイントクラスのP1をオブジェクトと呼ばれていると私はベクトルを設定しようとしていますego_points オブジェクトのtransmittedDataP1に等しいと呼ばれます。私はgetVector()関数を使ってベクトルego_pointsを構築することはできますが、データにアクセスすることはできません。誰も知りませんか?

ヘッダーファイル:

#pragma once 
#include "ros/ros.h" 
#include "sensor_msgs/LaserScan.h" 
#include "iostream" 
#include "string" 
#include "motor_driver/Motor_speeds.h" 
#include "motor_driver/cartesian.h" 
#include <vector> 

#ifndef MOTOR_DRIVER_H 
#define MOTOR_DRIVER_H 

using namespace std; 
using namespace motor_driver; 

class Points { 
     public: 
       vector<float> scannedData; 
       int i; 
       int size; 
       int size1; 
       int size2; 

       Points() : scannedData(0) {}   //Must match the class name. This is the constructor. 

       void set(vector<float> transmittingData){ 
         transmittedData = transmittingData; 
       } 

       void ScanCallback(const sensor_msgs::LaserScan::ConstPtr& scan) { 
           scannedData.clear(); 
           size = scan->ranges.size(); 
           scannedData.resize(size); 
           for(i = 0; i < size; i = i + 1){ 
             scannedData.at(i) = scan->ranges[i]; 
           } 
           set(scannedData); 
       } 

       int getSize(){ 
         return size; 
       } 

       vector<float> getVector(){ 
         return transmittedData; 
       } 

     private: 
       vector<float> transmittedData; 
}; 
#endif 

メインコード:

#include "ros/ros.h" 
#include "sensor_msgs/LaserScan.h" 
#include "iostream" 
#include "string" 
#include "motor_driver/Motor_speeds.h" 
#include "motor_driver/cartesian.h" 
#include <motor_driver.h> 
#include <vector> 


using namespace std; 
using namespace motor_driver; 
Points p1; 

int main(int argc, char** argv) { 
     ros::init(argc, argv, "motor_driver_node"); 
     ros::NodeHandle nh; 
     ros::Subscriber sub; 
     ros::Rate r(1); 
     int ss; 
     int newsize; 
     int index; 
     vector<float> ego_points; 
     while (ros::ok()) { 
       sub = nh.subscribe<sensor_msgs::LaserScan>("/scan",10, &Points::ScanCallback, &p1); 
       newsize = p1.getSize(); 
       ego_points.clear(); 
       ego_points.resize(newsize); 
       ego_points = p1.getVector(); 
       cout << ego_points.at(1) << endl; 
       r.sleep(); 
       ros::spinOnce(); 
     } 
     return 0; 
} 

マイエラー:

:~/Desktop/Naes_Thesis$ rosrun motor_driver motor_driver_node 
terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 
Aborted (core dumped) 
+0

デバッガは 'p1'に含まれるベクトルのサイズについてあなたに何を伝えますか? – 1201ProgramAlarm

答えて

0

ベクトルは、少なくとも2つの要素を持っていますか?最初の要素にアクセスするには、

cout << ego_points.at(0) << endl; 

また、サイズの方法が間違っている可能性があります。それ以外の場合は大きさが、私はそれを考え出し実際に実際のベクトルの大きさ

+0

ありがとうございます。 1)はいベクトルは複数の要素です(通常は360要素あります)、1を使って最初の要素を取得しようとしていなかったので、そこに数値を投げただけです。 2)あなたが提案したようにgetSize関数に変更しました。私はまだエラーが発生しています。 –

0

とは異なる値が含まれていてもよい

int getSize() const { 
    return transmittedData.size(); 
} 

:それはこのようなものでなければなりません。問題は、ベクトルが構築されるまでベクトルのサイズが0であることでした。だから、if(vector = 0)の部分をコードに追加し、それを修正しました。 Noel-lopesと1201ProgramAlarmに感謝します。

関連する問題