2010-10-22 97 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