2011-01-06 10 views
0

私は働くように見えるニブルクラスを作成しましたが、複数回使用すると結果が異なります。次のコードで問題を説明する必要があります。クラスが一貫していません

#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

ドゥ次のように変更:

最後に
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] ....です。 。定義では、 "私は4つの要素を持っていたいと思う"と言わなければならない。それは本b [4]である。 0〜3から始まる4つの要素 –

+0

この問題が解決した場合は、この問題を受け入れたものとしてマークする必要があります。 –

関連する問題