2010-10-22 96 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 2010-10-22 10:01:37

回答

0

一般來說,如果您希望它們被其他源文件使用,則無法在源文件中定義函數模板體。編譯器需要能夠看到模板定義以實例化代碼。

解決方案是在頭文件中定義函數模板體。

+0

我在.h .did中定義了它,意思是.h文件? – bahar 2010-10-22 09:57:29

+0

我的代碼在olrs.cc中,我的原型在olsr.h文件中 – bahar 2010-10-22 09:58:04

+0

@bahar:是的,問題在於函數模板不是函數。在你使用它們之前它們不存在;它們必須對使用它們的代碼可見。通常的解決方案是將函數模板主體放入頭文件中。請參閱http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13。 – 2010-10-22 10:00:51

0

顯然你忘了鏈接一些庫二進制文件。使用gcc,您可以指定庫使用-l-option進行鏈接。

+0

謝謝,但我不知道這個二進制文件,你有嗎? – bahar 2010-10-22 09:59:56

+0

@bahar:您的錯誤消息表明您正在使用[ns-3網絡模擬器](http://www.nsnam.org/)的某個部分。如果你想使用它的功能,你必須鏈接到這個庫。如果你不知道鏈接是什麼,[閱讀此](http://en.wikipedia.org/wiki/Linker_%28computing%29)。 – 2010-10-22 10:07:54

+0

謝謝,是的,我在ns-3工作,我想知道如何找到我必須鏈接到的庫? – bahar 2010-10-22 12:26:19