2012-12-01 34 views
0

我在打印出結構成員時遇到了一些麻煩。這是我到目前爲止有:打印出陣列成員的對象錯誤

struct Code 
{ 
    char letter; 
    string sequence; 
} 

void createCode(HuffmanNode *root, string codestr, Code *codeBook, int count) 
{ 
    if(root->getRight() == NULL && root->getLeft() == NULL) 
    { 
    Code code; 
    code.letter = root->getLetter(); 
    code.sequence = codestr; 
    codeBook[count] = code; 
    count++; 
    } 
    else 
    { 
    createCode(root->getLeft(), codestr + "1", codeBook, count); 
    createCode(root->getRight(), codestr + "0", codeBook, count); 
    } 
} 

這工作都正常,但主當我試圖打印出來的成員序列在我的代碼的數組中的碼本:

string codestr; 
count = 0; 
Code codeBook[256]; 
createCode(root, string codestr, codeBook, count); //root is already created 
for(int i = 256; i >= 0; i--) 
{ 
    if(isalpha(codeBook[i].letter)) 
    cout << codeBook[i].sequence << " "; 
} 

只有最後我存儲的字符串被打印。可能有人知道一個修復程序,爲什麼會發生這種情況?如果有人能夠幫助,那會很棒!

回答

0

createCodecount不是遞增,因爲你是通過值傳遞給它,切換到通過引用傳遞:

void createCode(HuffmanNode *root, string codestr, Code *codeBook, int& count) 

陣列的碼本包括256個元素,但索引是從0到255的for循環應是:

for(int i = 255; i >= 0; i--) 

否則訪問超出界限的數組元素是未定義的行爲。

+0

感謝您的支持!我只是解決了這個問題,但它仍然沒有正確打印......任何其他提示? – user200081

+0

你應該通過引用 – billz

+0

通過countCode創建代碼啊,這是完美的工作。謝謝! – user200081

1

主要問題是createCode()總是通過count=0。因此,您將所有Code條目存儲在數組中的第零個位置,最後一個將覆蓋所有以前的條目。

要修復,請通過引用或指針傳遞count,或者使函數返回新值count

最後,for循環的起始值超出範圍(以1爲單位)。

+0

那麼當我調用createCode()計數增加我的if語句不是嗎? – user200081

+0

@ user200081:不是。你在第一個分支中增加它,然後在第二個分支中遞歸地調用createCreate()。你永遠都不會這樣做。 – NPE

+0

啊,幫助。謝謝!我明白我現在做錯了什麼。我需要通過參考...... – user200081