2016-11-22 5 views
0

Я кодирую плагин для XPLANE10, который получает MSG из ROS. My IDE - QTcreator 4.1.0, основанный на QT 5.7.0 для 64-битного Ubuntu. Я хотел бы использовать C++ 11 Стандартыstd :: map pass by reference Указатель на объект

Мой код объяснил

Основной инициализирует ROS и создает карту -> контейнер. ROS вращается в цикле, пока мой графический интерфейс не отправит MSG, где должен летать мой AirPlane.

ГЗС содержит 3 поплавки (фи, тета, пси), где «фи» является аэроплан ID, тета содержит идентификатор для моего ETA (расчетное время прибытия) и пси содержит идентификатор для моей позе Все из Идентификаторы сохраняются в ParameterServer (lookuptable). Итак, в начале я просматриваю активные объекты, которые возвращают вектор. Я хотел бы сохранить их на карте, где ключ - это идентификатор AirCraft, а второй параметр - экземпляр объекта.

Так я инициализирован, например, (смотрел в контейнер во время отладки):

[0] first = 1 // Airplane ID1 
[0] second = new CObject(freq) 
[1] first = 2 // Airplane ID2 
[1] second = new CObject(freq) 

Если я получаю MSG из GUI

phi = 1 
theta=2 
psi=3 

, ROS будет обратный вызов

MSG(....std::map<i32, CObject> &container) 

// если phi равно 1, используйте mapkey 1 и запускайте метод do_stuff из CObject

do_stuff(phi, theta, psi,freq) 

Я хотел бы вызвать в функции от главного

int getPlanes(std::map<i32,CObject>& container) 
{ 
... 
getActiveAirplanesFromServer(activePlanes); 
} 

Первый вопрос: Как я передать контейнер в мой обратный вызов?

Второй вопрос: Как я распараллеливание do_stuff(), поэтому мой обратный вызов возвращается к основной и я в состоянии командовать больше самолетов, а остальные рассчитываются?

Третий вопрос: Как бы правильный синтаксис для getPlanes передать контейнер по ссылке так getPlanes() может изменить его?

Четвертый вопрос: Есть ли разница между

std::map<i32,CObject*> map 
std::map<i32,CObject>* map 

и

std::map<i32,CObject*>::iterator it=container->begin(); 
    std::map<i32,CObject*>::iterator* it=container->begin(); 

Если да, то, что я хочу?# 4Solved

// I have to edit stuff 'cause of some restrictions in my company. 
#include "Header.h" 
int main() 

{ 
    f64 freq = 10; 
    std::map<i32, CObject>* container; 
    std::map<i32,CObject>::iterator* it=container->begin(); 


    // ROS 
    if(!ros::isInitialized()) 
    { 
     int rosargc = 0; 
     char** rosargv = NULL; 
     ros::init(rosargc, rosargv, "MainNode");//), ros::init_options::AnonymousName); 

    } 
    else 
    { 
     printf("Ros has already been initialized.....\n"); 
    } 
    ros::NodeHandle* mainNodeHandle=new ros::NodeHandle; 
    ros::AsyncSpinner spinner(2); 
    ParameterServer * ptrParam= new ParameterServer(mainNodeHandle); 
    ros::Subscriber airSub=mainNodeHandle->subscribe<own_msgs::ownStruct>("/MSG", 
                      1000, 
                      boost::bind(MSG, 
                         _1, 
                         freq, 
                         container)); 

    std::vector<i32> activePlanes; 
    i32 retVal=0; 
    retVal += ptrParam-> ParameterServer::getActiveAirplanesFromServer(activePlanes); 
    if (retVal == 0 && activePlanes.size()>0) 
    { 

     for (u32 j =0; j <activePlanes.size(); j++) 
     { 

      container->insert (std::pair<i32,CObject> (activePlanes[j] , new CObject(freq))); 


     } 
    } 

    while (ros::ok()) 
    { 
     spinner.start(); //spinnt sehr viel :-) 
     ros::waitForShutdown(); 
    } 
    std::cout<<"ENDE"<<std::endl; 
    int retval = 1; 
    return retval; 
} 

void MSG(const own_msgs::ownStruct<std::allocator<void> >::ConstPtr &guiMSG, 
            f64 freq, 
            std::map<i32, CObject> &container) 
{ 



    if ((guiMSG->phi != 0) && (guiMSG->theta != 0) && (guiMSG->psi != 0)) 
    { 
     std::string alpha = std::to_string(guiMSG->phi)+std::to_string(guiMSG->theta)+to_string(guiMSG->psi);  
    container.at(guiMSG->phi) -> do_stuff(guiMSG->phi,guiMSG->theta,guiMSG->psi, freq); 
    } 
    else 
    { 
     std::cout<<" Did not receive anything\n"<<endl; 

    } 

} 


void do_stuff(...) 
{ 
//copy the IDs to private Member of this single Object 
//setROS() for this single Object 
//callback the current AC pose via ID from XPLANE 
//callback the wished AC pose via ID from ParamServer 
// do some calculations for optimum flight path 
// publish the Route to XPlane 

} 

EDIT :: Проблема я получаю это скомпилировать сейчас, и если отладить его и установить точку останова:

void MSG(const own_msgs::ownStruct<std::allocator<void> >::ConstPtr &guiMSG,f64 freq,std::map<i32, CObject*> &container) 
{ 
.. 
/*->*/ container.at(guiMSG->)... 
} 

Контейнер остается пустым.

+3

Первых из всего, что я предлагаю вам [найти книгу для начинающих] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), потому что у вас много ошибок начинающих в вашем коде. Чтение книги научит вас разнице между «std :: map» и «std :: map *». –

+0

Зачем вам нужна 'std :: map *'? – CinCout

+0

Я что-то пробовал. Не удалось получить пропущенную ссылку с работающей картой. И iam не разрешено объявлять глобальную карту. – MightyMirko

ответ

0

Так я читал некоторые вещи о указателях и я видел мои ошибки ..

Я смущен * и & , если я хочу передать адрес переменного я должен написать как

int main() 
{ 
int a = 0; 
AddTwo(&a) 
cout<<a<<endl; // Output: 2 
} 
void AddTwo(int* a) 
{ 
a+=2; 
} 
+0

Это увеличивает ваш указатель на 2 - это означает, что адрес, на который указывает указатель, изменяется на два, а не содержимое текущего адреса. Не важно, поскольку копия указателя умирает с вызовом функции. Либо переходите к разыменованию, * a + = 2, либо идите с вызовом по ссылке AddTwo (int & a). Мне кажется, что вы должны начать с основ, например http://www.cplusplus.com/doc/tutorial/pointers/. Тем не менее, обычный стандарт с C++ заключается в том, чтобы избежать указателей, когда это возможно. Скорее создайте контейнеры, которые обрабатывают указатели, чем используют их напрямую. – Aziuth

+0

Чтобы уточнить, «указатель умирает», см., Int * a - это адрес, указывающий на место, где хранится целое число. Скажем, адрес 1337. Теперь вы должны дать функции AddTwo значение 1337, чтобы что-то сделать с ним. Он принимает это значение и добавляет 2, что составляет 1339. На данный момент мы не знаем, что в позиции 1339 в памяти сохраняется, может быть что угодно, и если вы попытаетесь получить к ней доступ, это, скорее всего, приведет к ошибке (только правильная ситуация - это когда мы работаем с массивами). Затем функция заканчивается, и локальная переменная a, которая хранит 1339, удаляется. – Aziuth