2011-01-06 2 views
0

Я создал класс nibble, который работает, но когда я использую его более одного раза, результат отличается. следующий код должен иллюстрировать проблемы.Класс несовместим

#include <cstdlib> 
#include <iostream> 
using namespace std; 
class nibble{ 
public: 
    nibble(){} 
    nibble(int n){ 
     for (int x=0;x<4;x++){ 
      b[x]=bool(n%2); 
      //cout<< x<<"b[x]="<<b[x]<<endl; 
      n/=2; 
     } 
    } 
    nibble(char h){ 
     char* end; 
     int n = strtol(&h,&end,16); 
     for (int x=0;x<4;x++){ 
      b[x]=n%2; 
      n/=2; 
     } 
    } 
    bool bit(int n){ 
     n-=2;// this should only have to be n-- 
     return b[n]; 
    } 
    void set(int n,bool bl){ 
     n-=2;//this should only have to be n-- but n-- doesn't work. 
     b[(n)]=bl; 
    } 
    string bin(){ 
     string out; 
     if (b[0]){out+='1';} 
     else{out+='0';} 
     if (b[1]){out+='1';} 
     else{out+='0';} 
     if (b[2]){out+='1';} 
     else{out+='0';} 
     if (b[3]){out+='1';} 
     else{out+='0';} 

     out+='b';//cout<<'b'<<endl;; 
     return out; 
    } 
    char hex(){ 
     int out=0; 
     for (int x=3; x>-1; x--){ 
      out *=2; 
      out+=b[x]; 
     } 
     //cout<< "hex() out="<<out<<endl; 
     switch (out){ 
      case 0: 
      return '0'; 
      break; 
      case 1: 
      return '1'; 
      break; 
      case 2: 
      return '2'; 
      break; 
      case 3: 
      return '3'; 
      break; 
      case 4: 
      return '4'; 
      break; 
      case 5: 
      return '5'; 
      break; 
      case 6: 
      return '6'; 
      break; 
      case 7: 
      return '7'; 
      break; 
      case 8: 
      return '8'; 
      break; 
      case 9: 
      return '9'; 
      break; 
      case 10: 
      return 'A'; 
      break; 
      case 11: 
      return 'B'; 
      break; 
      case 12: 
      return 'C'; 
      break; 
      case 13: 
      return 'D'; 
      break; 
      case 14: 
      return 'E'; 
      break; 
      case 15: 
      return 'F'; 
      break; 
     } 
} 
    int val(){ 
     int out=0; 
     for (int x=3; x>-1; x--){ 
      out *=2; 
      out+=b[x]; 
     } 
     return out; 
    } 

private: 
    bool b[3]; 
}; 
/** 
nibble operator~(nibble in); 
nibble operator|(nibble in1, nibble in2); 
nibble operator&(nibble in1, nibble in2); 
*/ 
int main(){ 
char c; 
nibble a(10); 
cout<<a.bin()<<" "<<a.hex()<<" "<<a.val()<<endl; 
cout<<a.bit(4)<<' '<<a.bit(3)<<' '<<a.bit(2)<<' '<<a.bit(1)<<'b'<<endl; 

/*** when this code is inserted, the above code gives a different result. I have no clue why this happens 

cin>>c; 
nibble b('A'); 
cout<<b.bin()<<" "<<b.hex()<<" "<<b.val()<<endl; 
cout<<b.bit(4)<<' '<<b.bit(3)<<' '<<b.bit(2)<<' '<<b.bit(1)<<'b'<<endl;/* 
***/ 
} 

Я чувствую, что это должно быть что-то действительно тупым, но я работал над ним на некоторое время, и не могу найти проблему. заранее спасибо.

+0

Какие результаты вы видите и без дополнительного кода? – Lazarus

ответ

1

Do следующие изменения:

bool bit(int n){ 
     return b[n-1]; 
    } 

    void set(int n,bool bl){ 
     b[n-1]=bl; 
    } 

Наконец (как вы пропустили это?)

private: 
    bool b[4]; //you had b[3] 
+0

это b [0-3] право или я смешался с fortran Спасибо – Mobius

+0

b [0], b [1], b [2], b [3] .... так что есть четыре элемента 0-3 , В определении вы должны сказать: «Я хотел бы иметь четыре элемента», то есть книгу b [4]; четыре элемента, начиная с 0 до 3 –

+0

, если это решит вашу проблему, тогда вы должны отметить эту проблему как принятую. –