Где моя логика не работает? - PullRequest
1 голос
/ 06 апреля 2011

Я сделал работу - но мой вывод странный. Я в основном пытаюсь сравнить кучу объектов, и если они разделяют ттн и их время истекло - тогда им нужно пересчитать ттн. После проверки всех хостов я увеличиваю время и пытаюсь снова. Цель состоит в том, чтобы найти первый хост, который сможет пройти проверку без столкновения. Это в основном симуляция сети, которая выполняет некоторый подсчет отката, если два хоста отправляют одновременно (CLOCK). Я вставил проверку, чтобы убедиться, что хост не проверил сам себя - я знаю, каков мой ожидаемый результат, и это не так. Я работал через это несколько раз, но не могу найти свои логические ошибки. Есть указатели?

// Should insert n number as argument 1 on the command line. 
#include <iostream>
#include <vector>
#include <stdlib.h> // srand(), time()

static int CLOCK = 0;

class Host{
  private:
    int sid;
    int cc;
    int ttns;

  public:
    Host();
    int get_sid(){ return sid; }
    void set_sid(int id){ sid = id; }
    int get_cc(){ return cc; }
    void inc_cc(){ cc += 1; }
    int get_ttns(){ return ttns; }
    void new_ttns(){ ttns = (rand()%(cc+1))+CLOCK+1; }
  };

Host::Host(){
  sid  = -666;
  cc   = 0;
  ttns = 0;
}

bool work(std::vector<Host> &hosts){
  int count = 0;

  for(CLOCK = 0; /*INFINITE*/; CLOCK++){
      for(int i = 0; i < hosts.size(); i++){
        count = 0;
          for(int n = 0; n < hosts.size(); n++){
              if( (i != n) && /* host i doesn't compare to host n */
                  (hosts[i].get_ttns() == hosts[n].get_ttns()) &&/* host i and n share ttns */ 
                  (hosts[i].get_ttns() == CLOCK)  /* host i ttns = now */
                ){ 
                hosts[i].inc_cc();
                hosts[i].new_ttns(); 
                count = -666; // collision occured
              }
          count++;
          }
        if ( count == hosts.size() ){
          std::cout << "Host " << hosts[i].get_sid() << "\nTTNS: " << hosts[i].get_ttns();
          std::cout << std::endl;
          return false;
        }
     } 
  }

  return true; // pretty pointless
}

int main(int argc, char *argv[]){
  srand(time(NULL));
  std::vector<Host> hosts;

  // Push hosts into vector
  int nhosts = atoi(argv[1]);
  for(int i = 0; i < nhosts; i++){
    Host newhost;
    newhost.set_sid(i);
    hosts.push_back(newhost);
  }

  while (work(hosts)){
    ; // hang out 
  }

  return 0;
}

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

одна из ошибок, вероятно, в этой строке:

(hosts[i].get_ttns() == CLOCK)

Вы не можете сравнить это, поскольку CLOCK является глобальным и увеличивается более чем на один хост. это означает, что хост не имеет монотонного CLOCK.

может быть, вы хотите это:

(hosts[i].get_ttns() <= CLOCK
0 голосов
/ 06 апреля 2011

Мне кажется, вы должны обновить cc и ttns для хоста n, который вы проверяете во внутреннем цикле.

            hosts[n].inc_cc();
            hosts[n].new_ttns(); 

Вместо

            hosts[i].inc_cc();
            hosts[i].new_ttns(); 

И переместить чек на

    ( hosts[i].get_ttns() == CLOCK )

вне внутреннего цикла.

    if ( hosts[i].get_ttns() == CLOCK )
      for(int n = 0; n < hosts.size(); n++){

Тогда состояние внутри становится

           if( (i != n) && /* host i doesn't compare to host n */
              (hosts[i].get_ttns() == hosts[n].get_ttns()) /* host i and n share ttns */
           ){

Таким образом, вы не count++ для недопустимых хостов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...