Newsgroup: it.comp.lang.c++
Titolo: LINKER ERROR ... sono io oppure è il DEV?

Ciao a tutti,
sto scrivendo un mini simulatore.
Sono appena agli inizi e mi sto incartando con una baggianata... (almeno 
credo...)
...allora... non sò perchè, ma quando compilo, il dev mi stampa una sfilza 
di errori (tutti uguali):
  [Linker error] undefined reference to `PhyLayer::tripSequence'
cioè sarebbe a dire che il compilatore compila il simbolo, ma poi il linker 
se lo perde,
GIUSTO?
secondo voi, come potrei causare una cosa del genere?
BHO!
questo è il sorgente, le ho provate tutte, ed ora non sò più cosa fare...
--------------------------------
#ifndef PHYLAYER_H
#define PHYLAYER_H
#include <cstdlib>
#include <time.h>
#ifdef CONCORRENTE
   #include <unistd.h> // per fare syscall
#endif
#define BASE_RTT 50
using namespace std;
// struttura necessaria per simulare il viaggio di ogni pacchetto
class pktTrip {
   public:
      bool lost;  // se TRUE scarta il pacchetto
      bool error; // se TRUE pacchetto conterrà errori
      int rtt;    // durata del RTT in msec
};
// classe che modella il mezzo fisico
class PhyLayer : public Layer {
   public:
      // costruttore. inputs: NomeLayer, LvlSuperiore, LvlFisicoRemoto
      PhyLayer::PhyLayer ( char* name, Layer* upLay, Layer* remPhyLay )
          : Layer ( name, upLay, remPhyLay )  // costruttore padre
          { tripSequence = NULL; };
      // primitiva per l'invio dei pacchetti (VIRTUALE)
      // considera il livello fisico dell'host adiacente come livello 
sottostante
      virtual void send ( Packet* pkt );
      // genere una sequenza casuale di trasmissione utile per rendere
      // ripetibili e non note a-priori le condizioni del canale di 
trasmissione
      static void buidTransmissionScheme ( double probLoss, //prob di 
perdita
                                           double probError,//prob di errore
                                           int percVarRTT,// variab del RTT 
x10^-2
                                           int nPkts, // numero di pacchetti 
da inviare
                                           int bRTT = BASE_RTT // RTT min in 
msec
                                           );
   private:
      static pktTrip *tripSequence;
};
/******************************************************************************/
/*              BEGINNINGS OF METHOD'S IMPLEMENTATIONS 
*/
/******************************************************************************/
//------------------------------------------------------------------------------
//         static void buidTransmissionScheme ( ... )
//------------------------------------------------------------------------------
void PhyLayer::buidTransmissionScheme (
                                     double probLoss, //prob di perdita
                                     double probError,//prob di errore
                                     int percVarRTT,// variab del RTT x10^-2
                                     int nPkts, // numero di pacchetti da 
inviare
                                     int bRTT ) // RTT min in msec
{
     // se esiste già uno schema... deallocalo!
     if ( tripSequence != NULL )
        delete [] tripSequence;
     // crea l'array delle sequenze..,
     tripSequence = new pktTrip [nPkts];
     // seleziona il seme della funz rand
     srand( (unsigned int)time( NULL ) );
     // genera il comportamento di ogni pacchetto
     // div 0!!
     for ( int i=0; i<nPkts; i++ ) {
         tripSequence[i].lost =  ( rand() % (int)(1/probLoss) == 0 );
         tripSequence[i].error = ( rand() % (int)(1/probError) == 0 );
         tripSequence[i].rtt = ( bRTT * ( 100 + rand()%percVarRTT ) ) / 100;
     }
};
//------------------------------------------------------------------------------
//         virtual void send ( Packet* pkt )
//------------------------------------------------------------------------------
void PhyLayer::send ( Packet* pkt ) {
    int pktNum = pkt->getSeqNumber();
    // se il pacchetto deve andare perso...
    if ( tripSequence[pktNum].lost ) {
       delete pkt;                   // ...cancellalo!
       return;                       // e ritorna!
    }
    // inserisci, se c'è, l'errore...
    if ( tripSequence[pktNum].error )
       pkt->setCorrupt();
    //simula il RTT e lo moltiplica x1000 xkè usleep prende in input sec 
x10^-6
#ifdef CONCORRENTE
    usleep ( tripSequence[i].rtt * 1000 );
#endif
    //pacchetto arrivato sull'host remoto!
    downLayer->riceve( pkt );
};
#endif
//---------------------------------------
aiuto, please!
PS, visto che ci sono, domandina sull'uso di fork() e wait():
se faccio:
---------------------------------
void AppLayer::generateStream( int nPkts ) {
     // crea nPkts Processi per inviare nPkts
     for ( int i=0; i<nPkts; i++ ) {
         if ( (int pid = fork()) == 0 ) { // se è il processo figlio...
            send ( new Packet(i) );
            return;
         }  else if ( pid < 0 )     // errore -> stampa e reinvia!!
              cout << "ERROR sending packet n. " << i-- << endl;
    }
     // aspetta i figli
     for ( int i=0; i<nPkts; i++ )
         wait ();
};
-------------------------
facendo N fork() dal processo padre seguiti da N wait() così come sul 
codice,
aspetto che tutti gli N processi figli terminino, VERO?
(lo sò che sono somaro, ma prima o poi imparo :)
Grazie,
DanZz
-- 
--------------------------------------
http://gnaskuru.altervista.org
the 
Gn.AS.ku.RU
. project HOME
-------------------------------------- 

       static pktTrip *tripSequence;
Questo č dichiarato, ma non definito. Aggiungi
  pktTrip * PhyLayer::tripSequence = 0;
in una qualsiasi unitą di compilazione.
Non capisco perņ perché gli assegni NULL nel construttore. Sei sicuro che 
volevi dichiararlo static?
M


grazie!!!! ^_^
DanZz