2010-10-22 5 views
0

Я Ван определить простую функцию в моей программе, поэтому я добавил этот прототип в файле .h:проблема с простой функцией

 double TimeCalculation (Ptr <Node> mynode,Ptr <Node> nb_node, Ptr <Ipv4> nbipv4, Ptr <Ipv4> myipv4); 

тогда я написал эту функцию:

double 
    TimeCalculation (Ptr <Node> mynode, Ptr <Node> nb_node, Ptr <Ipv4> nbipv4, Ptr <Ipv4> myipv4) 
    { 
       float cpx,expx,myexpx; 
       float cpy,expy,myexpy; 
       float cpz,expz,myexpz; 
       Vector3D cPosition; 
       double itspeed; 
    /////////// finding current position and exposition for my current neighbor 
       cPosition = nbipv4->GetObject<MobilityModel>()->GetPosition(); 
       cpx = nbipv4->GetObject<MobilityModel>()->GetPosition().x; 
       cpy = nbipv4->GetObject<MobilityModel>()->GetPosition().y; 
       cpz = nbipv4->GetObject<MobilityModel>()->GetPosition().z; 
       expx = nb_node->exPosition.at(0); 
       expy = nb_node->exPosition.at(1); 
       expz = nb_node->exPosition.at(2); 
       itspeed = nbipv4->GetObject<ConstantSpeedPropagationDelayModel>()->GetSpeed(); 
       Vector3D normit(0.0,0.0,0.0),mycPosition; 
       //Ptr <Node> mynode; 
       // Ptr <Node> nb_node; 
       //v1 
       //Vector myexposition = Ipv4->GetObject<Node>()->GetmyPosition(); 
       float normitx= cpx - expx; 
       float normity= cpy - expy; 
       float normitz= cpz - expz; 
       float itVnorm = sqrt((normitx * normitx) + (normity * normity)+(normitz * normitz)); 

       //hamide:update the amount of exposition to current position 
       //pos.insert(it2 ,cPosition); 
       nb_node->exPosition.at(0) = cPosition.x; 
       nb_node->exPosition.at(1) = cPosition.y; 
       nb_node->exPosition.at(2) = cPosition.z; 
       //for calculating v2 
       //finding exposition for my node which is calculating MPR set 
       myexpx = mynode->exPosition.at(0); 
       myexpy = mynode->exPosition.at(1); 
       myexpz = mynode->exPosition.at(2); 
       mycPosition.x = myipv4->GetObject<MobilityModel>()->GetPosition().x; 
       mycPosition.y = myipv4->GetObject<MobilityModel>()->GetPosition().y; 
       mycPosition.z = myipv4->GetObject<MobilityModel>()->GetPosition().z; 
       double mycpx = myipv4->GetObject<MobilityModel>()->GetPosition().x; 
       double mycpy = myipv4->GetObject<MobilityModel>()->GetPosition().y; 
       double mycpz = myipv4->GetObject<MobilityModel>()->GetPosition().z;   
       //Vector norm(0.0,0.0,0.0); 
       double normx= mycpx - myexpx; 
       double normy= mycpy - myexpy; 
       double normz= mycpz - myexpz; 
       //myexPosition.at(1) = mycPosition.at(1); 
       //myexPosition.at(2) = mycPosition.at(2); 
       //myexPosition.at(3) = mycPosition.at(3); 
       mynode->exPosition.at(0) = mycPosition.x; 
       mynode->exPosition.at(1) = mycPosition.y; 
       mynode->exPosition.at(2) = mycPosition.z;   
       double myVnorm = sqrt((normx * normx)+(normy * normy)+(normz * normz)); 

       //v1*v2 
       float entmulti = ((normitx * normx) + (normity * normy) + (normitz * normz)); 
       // calculating cos for the angel between two vectors for two nodes 
       float cos = (entmulti /(itVnorm * myVnorm)); 
       //the maximum distance a node can see its neighbor its based on the 
       //settings we choose for our topology and simulation condition 
       int R = 220; 
       //v is the speed of each node 
       double myspeed = myipv4->GetObject<ConstantSpeedPropagationDelayModel>()->GetSpeed(); 

       double Td = (R * R)/((myspeed *myspeed)+(itspeed * itspeed)-(2 * itspeed * myspeed*cos)); 
       return sqrt(Td); 

    } 

, но когда я запускаю моя программа имеет эту ошибку:

debug/libns3.so: undefined reference to `ns3::olsr::RoutingProtocol::TimeCalculation(ns3::Ptr<ns3::Node>, ns3::Ptr<ns3::Node>, ns3::Ptr<ns3::Ipv4>, ns3::Ptr<ns3::Ipv4>)' 
collect2: ld returned 1 exit status 

, а также существует проблема, которая не работает идеально, я буду полностью thankfu l если кто-то поможет мне с этой ошибкой, а также если у вас есть другая проблема в моем коде.

+0

Как мне это сделать, многие из них работали для меня, и я использовал их. – bahar

ответ

0

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

Решение состоит в том, чтобы определить тело шаблона функции в файле заголовка.

+0

Я определил его в .h .did u mean .h file? – bahar

+0

мой код находится в olrs.cc и мой прототип в файле olsr.h – bahar

+0

@bahar: Да, проблема в том, что функциональные шаблоны не являются функциями. Они не существуют, пока вы их не используете; они должны быть видимы для любого кода, который их использует. Обычным решением является включение тела шаблона функции в файл заголовка. См. Http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13. –

0

Видимо, вы забыли связать некоторые бинарные файлы библиотеки. С помощью gcc вы можете указать библиотеки для ссылки, используя -l-option.

+0

спасибо, но я не имею ни малейшего представления об этом бинарнике, не так ли? – bahar

+0

@bahar: Ваше сообщение об ошибке предполагает, что вы используете некоторую часть симулятора сети [ns-3] (http://www.nsnam.org/). Вы должны ссылаться на эту библиотеку, если хотите использовать из нее функции. Если вы не знаете, что такое ссылка, прочитайте это (http://en.wikipedia.org/wiki/Linker_%28computing%29). –

+0

спасибо, да я работаю в ns-3, и мне хотелось знать, как я могу найти библиотеку, к которой я должен подключиться? – bahar

Смежные вопросы