Avatar billede conrad Nybegynder
08. november 2003 - 13:23 Der er 15 kommentarer og
3 løsninger

Hvorfor fejler denne kode??

Gennem en lang og sej test proces,har jeg fundet ud af at følgende kode frembringer fejl efter lang tids kørsel
Den kode der er mærket med ok medfører ingen fejl hvor imod den der er mærket med ikke ok giver fejl

double temp
for(int i =1; i < stopat+1;i++)
{
  if(trust_manager->isKnown(route[i].getNSAddr_t()))
  {
    //OK             
    int i = route[i].getNSAddr_t();
    temp = ( (double)rand()/(double)RAND_MAX+1 );              //IKKE OK
temp =trust_manager->getTrustValue(route[i].getNSAddr_t())->getValue();
           
            total_trust = total_trust + temp;
            total_nr_of_nodes++;
    }
Avatar billede conrad Nybegynder
08. november 2003 - 13:25 #1
metoder :

double TrustValue::getValue()
{
    return this->value;
}

TrustValue* TrustManager::getTrustValue(const nsaddr_t& nid)
{
    //remove this check after "debug"
    map<nsaddr_t,TrustValue*>::iterator it;
    if(it == tvalues.end())
    {
      cout <<"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRRRRRRRRGGGGGGGGGGGGGGGGGGGG"<<endl;
    }   
    return tvalues[nid];
}
Avatar billede conrad Nybegynder
08. november 2003 - 13:28 #2
bool TrustManager::isKnown(nsaddr_t id)
{
    map<nsaddr_t,TrustValue*>::iterator it;
    it = tvalues.find(id);//if id doesn't exist it returns iterator to the end
    return(!(it == tvalues.end()));
}


og tvalues i TrustManager er map<nsaddr_t,TrustValue*> , hvor nsaddr_t er typedef int
Avatar billede arne_v Ekspert
08. november 2003 - 13:29 #3
Der er nogen ting i den kode jeg ikke forstår:

for(int i =1; i < stopat+1;i++)

route[i]

er route dimensioneret med stopat+1 elementer (0..stopat) ?
Avatar billede arne_v Ekspert
08. november 2003 - 13:29 #4
for(int i =1; i < stopat+1;i++)

    int i = route[i].getNSAddr_t();

hvorfor laver du en bariabel der skygger for løkke tælleren ?
Avatar billede conrad Nybegynder
08. november 2003 - 13:29 #5
Hvis det ikke var klart så er det :

temp =trust_manager->getTrustValue(route[i].getNSAddr_t())->getValue();

der giver problemet.

Håber på nogen kan komme med forslag til hvad der kan være galt
Avatar billede conrad Nybegynder
08. november 2003 - 13:31 #6
13:29:50: det var bare for i testen at se om alle elementer i arrayet kunne indexeres
Avatar billede conrad Nybegynder
08. november 2003 - 13:31 #7
arrrr
: vent , jeg vender tilbage når jeg har kaldt den noget andet end i
Avatar billede conrad Nybegynder
08. november 2003 - 13:36 #8
13:29:03> route indeholder nogle adresser. Adressen på den sender ligger i route[0]. En anden metode returnerer stopat, som er der destinationen ligger.
dvs route kan godt være længere end stopat, men alt efter stopat er uinterresant i denne sammenhæng
Avatar billede conrad Nybegynder
08. november 2003 - 13:58 #9
har lige kørt en succes fuld simulering hvor int i, hvar erstattet med int h. Det burde indikerere at det ikke er array adresseringen der er problemet.

Kan du se nogle problemer/fejl i den øvrige kode?
Avatar billede arne_v Ekspert
08. november 2003 - 15:57 #10
Der er ikke noget som springer i øjnene.

Jeg tror du bliver nødt til at putte nogle fprintf ind og se hvad der sker.

Eller noget:
  dbgf <<
hvis det skal være C++'sk.
Avatar billede conrad Nybegynder
08. november 2003 - 16:37 #11
hvad er dbgf?
Avatar billede arne_v Ekspert
08. november 2003 - 17:22 #12
ofstream dbgf("debug.log");

:-)
Avatar billede segmose Nybegynder
10. november 2003 - 09:16 #13
double TrustValue::getValue() {
  // this->value == "value i TrustValue" ikke?
  if (value ikke har lovlig værdi)
    springiluften(value);

    return this->value;
}

TrustValue* TrustManager::getTrustValue(const nsaddr_t& nid)
{
    //remove this check after "debug"
    map<nsaddr_t,TrustValue*>::iterator it;
---> skal it ikke tildeles en værdi før checket???
    if(it == tvalues.end())
    {
      cout <<"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRRRRRRRRGGGGGGGGGGGGGGGGGGGG"<<endl;
    } 
    return tvalues[nid];
}


er route defineret som

typex route[stopat+1];
har du check for at du ikke løber ud over enden på arrayet?
Avatar billede conrad Nybegynder
12. november 2003 - 13:03 #14
segmose> du har helt ret i at if(it == tvalues.end()) er en fejl - dog ikke den der fik det til at chrashe. Jeg har flyttet koden bid for bid til en tidligere version af simulatoren, hvor det kører uden problemer. ? :)

I må gerne lægge et svar begge 2 da i har været til stor hjælp med, dels at påpege fejl, og samtidig "bekræfte" at koden var OK
Avatar billede segmose Nybegynder
12. november 2003 - 13:35 #15
Ok.
Avatar billede arne_v Ekspert
12. november 2003 - 13:50 #16
ok
Avatar billede conrad Nybegynder
12. november 2003 - 14:39 #17
svar
Avatar billede conrad Nybegynder
12. november 2003 - 14:39 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester