2014-04-01 96 views
2

我一直在嘗試做一個線性反饋移位寄存器,但代碼中出現了一些我一直無法找到的錯誤,我嘗試通過以下方法來診斷問題:具有do-while循環處理該程序的基本操作,即異或中的位和移位他們的條件下,成爲兩個的任一個:C++中的do-while循環中的兩個條件

operSeq !=inpSeq 
turnCount < 31. 

該程序請求用戶輸入5個比特作爲LFSR的初始卡,那麼他/她必須輸入代表該多項式的第二個二進制序列:如果它是x^5+x^4+x^2+x^1+1;,則用戶應該輸入的序列是10111,如果它們中的任何一個是1,則檢查這些位,升ocation將被存儲在一個名爲xorArray的向量中。作爲此代碼的測試用例,如果用戶輸入作爲初始卡,並輸入01111作爲poly位置,則程序將生成無限數量的二進制序列,這些序列並不像正確地執行xor操作,以及它們也不會像循環指定的那樣在31輪之後終止!我需要幫助診斷此代碼。下面是它:

#include <iostream> 
#include <bitset> 
#include <vector> 
using namespace std; 

int main() 
{ 
    // int x, y; 
    int turnCount = 0; 
    bitset <5> inpSeq; 
    bitset <5> polyLoc; 
    bitset <5> operSeq; 
    bitset <5> bit; 
    vector <int> xorArray; 
    vector <int> keyReg; 

    cout << "Enter a 5-bit sequence: \n"; 
    cin >> inpSeq; 
    cout << "Enter poly: \n"; 
    cin >> polyLoc; 

    for (unsigned int i = 0; i < polyLoc.size(); i++) 
    { 
     if(polyLoc[i] == 1) 
     { 
      xorArray.push_back(i); 
     } 
    } 

    cout << "----" << "\n"; 
    operSeq = inpSeq; 
    keyReg.push_back(inpSeq[0]); 

    int x = xorArray[0]; 
    bit[4] = operSeq[x]; 
    do 
    { 
     for (unsigned int j = 1; j < xorArray.size() ; j=j+1) 
     { 
      bit[4] = bit[4]^operSeq[j]; 
     } 

     operSeq >>= 1; 
     operSeq[4] = bit[4]; 
     cout << operSeq << "\n"; 
     keyReg.push_back(operSeq[0]); 
     turnCount ++; 
    } while ((operSeq != inpSeq) || (turnCount < 31)); 

    cout << "Generated key is: "; 
    for (unsigned int k = 0; k < keyReg.size(); k++) 
    { 
     cout << keyReg[k]; 
    } 

    cout << "\n"; 
    cout << "Bit 1 positions: "; 
    for (unsigned int g = 0; g < xorArray.size(); g++) 
    { 
     cout << xorArray[g]; 
    } 
    cout << "\n"; 
    cout << "Key length is: " << keyReg.size(); 
    cout << "\n"; 
    cin.get(); 
} 
+0

'我需要幫助診斷這個代碼'。你寫了代碼嗎?如果你這樣做了,爲什麼不使用編譯器套件附帶的調試器來診斷代碼呢?很少有人第一次編寫完美的程序,因此我們使用調試器來調試代碼,以查看代碼違反我們的計劃的情況。你做到了嗎?如果是這樣,當聲明它應該終止時,while()語句有什麼值? – PaulMcKenzie

+0

我已經自己寫了,它編譯沒有錯誤!我在ubuntu上用g ++編譯它,編譯命令是我知道的關於g ++的唯一的東西。我不知道調試器,任何提示? –

+1

調試器是「gdb」。如果你不知道如何使用它,你不會走得太遠。而且,這個語句「它編譯沒有錯誤!」 - 這意味着程序將如何運行。正確編譯程序只意味着程序使用正確的C++語法。看起來你並沒有準備好學習如何編寫程序的強制性步驟,那就是調試。 – PaulMcKenzie

回答

1

您應該使用AND & &運營商,而不是OR ||運算符放在do {} while循環中。只要這兩個條件都是真的,只要其中一個條件成立,就可以繼續循環。

0

如果你的while循環在turnCount達到31之後沒有處理任何東西,那麼它正在拾取(operSeq!= inSeq)。

在你的同時,聲明,如果第一個條件是真的,它根本不會處理第二個條件。如果(operSeq!= inSeq)先試着把turnCount的條件放在一起,或者如果它們都需要成立才能運行,那就試着把它們放在一起。

會做這樣的評論,但不具備代表尚未:/

+0

順序無關緊要,因爲沒有副作用。 – clcto

+0

@clcto「副作用」是什麼意思? –

+1

@MohamedAhmed [副作用](https://en.wikipedia.org/wiki/Side_effect_%28computer_science%29)是當程序狀態發生變化時。例如,'if(i ++ == 2 && j - == 2)'這個順序很重要,因爲'j - '有副作用(它減少了'j'的值),但它只在'我++ == 2「。如果程序有'if(j-- == 2 && i ++ == 2)',執行將不會相同,因爲總是執行'j - ',但'i ++'可能不會。 – clcto

1

你的條件是(operSeq != inpSeq) || (turnCount < 31)。所以如果任一條件都是真的,那麼它會繼續循環。當turnCount >= 31因此您的條件應該是(operSeq != inpSeq) && (turnCount < 31)時,您想停止循環。

+0

這解決了一個問題,謝謝。我還有一個問題,那就是生成的序列不適合。如果用戶輸入10101作爲初始卡,01111輸入polyLoc,則會產生一個32位長度的密鑰,如果你看一下最後2圈產生的:10100和01010,你會發現從頭開始4位10100的權利,結果是1不是0! –

+1

請參閱我上面關於學習如何調試的評論。將打印語句放在整個地方,直到您可以清楚地看到發生了什麼。 – Peter

+0

會做!再次感謝你。 –