2011-10-01 250 views
0

我有一個Deck對象(卡片組),它是一個實現爲雙向鏈表的雙端隊列。我希望能夠隨意排列隊列,但我想要去解決它的方式超出了我的想象。相反,我選擇了預先洗牌陣列來指向牌,並在事實之後排隊。問題是,我現在的代碼似乎沒有初始化指針。初始化指針數組

void BuildDeck(Deck* deck) { 
    Card** cards = new Card*[20]; 
    const size_t MAX_INTEGER_LENGTH = sizeof(int) * 4; 
    char szPostfix[] = "_Card.bmp"; 

    for(int i = 1; i < 21; i++) { 
     char path[MAX_INTEGER_LENGTH + sizeof(szPostfix) + 1]; 
     sprintf(path,"%d%s",i, szPostfix); 
     cards[i-1] = new Card(i,path); 
    } 
    ShuffleArray(cards); 
    for (int i = 0; i < 20; i++) { 
     deck->PushTop(cards[i]); 
    } 
} 

void Swap(Card* a, Card* b) { 
    Card temp = *a; 
    *a = *b; 
    *b = temp; 
} 

void ShuffleArray(Card** cardArray) { 
    srand(dbTimer()); 
    for (int i = 0; i < 20; i++) 
     Swap(cardArray[i],cardArray[rand()%20]); 
} 

我想在那裏我搞砸了是在card[i] = new Card(...)線,但它在某種程度上權在我看來。

任何建議,將不勝感激。

免責聲明:我知道我應該使用大部分這些東西的標準庫,但我試圖先教自己最難的東西。這只是我學習的方式。

編輯:我修正了索引問題。現在我只是要弄清楚爲什麼一些圖像現在沒有繪製...:/感謝您的幫助!

+1

對於固定大小的數組,您必須使用自動對象(即'Card card [10] [20];')。只有當你真的需要動態分配時才應該使用'new'。 – iammilind

+1

你的'swap'例程會更好,因爲'void swap(Card *&a,Card *&b){Card * tmp = a; a = b; b = tmp; }'以節省大量不必要的數據複製。 –

+0

交換更正修復它!謝謝! –

回答

1

您的代碼有很多問題

  1. 您與1 <= i <= 20但對於20種元素的索引從0 <= index <= 19去數組循環。您需要使用cards[i-1] = new Card(i,path);

  2. 您正在分配指針數組cards但您並未解除分配它(內存泄漏)。一旦完成,或者使用Card *cards[20];而不是使用new來分配它,則可以使用delete[] cards;將其解除分配。

  3. 您計算MAX_INTEGER_LENGTH的方式顯示您並不真正瞭解sizeof的功能。

  4. 這就是沒有洗牌的原因。你寫了一個交換兩個指針的函數,但是交換的指針是函數的局部變量(參數),而不是數組的元素。一種解決方案是通過將參數引用,通過聲明與void Swap(Card *& a, Card *& b)交換參數,另一種解決方案是將指針傳遞給指針(但由於雙重間接,這需要更復雜的實現語法,並且還需要更改你調用函數的方式)。

+0

指數修正。謝謝。但會刪除我的數組刪除指針?我將這些指針傳遞給另一個集合;我不想刪除它們,直到其他收集完成,對嗎? –

+0

什麼是泄漏是用於混洗的指針數組(在'BuildDeck'中命名爲'cards')。在C++中刪除指針數組時,指針指向的對象不會自動刪除。正如我在答案中所說的那樣,如果你只是使用'Card * cards [20]'代碼就簡單了,'而不是用'new card * [20]'在堆上分配它。這樣,當你退出構建函數時,臨時數組就像其他自動變量一樣被自動釋放。 – 6502

1

在第一個循環中,您的起始索引爲0,而在第二個循環中,起始索引爲0.這可能是問題所在。

0

您的代碼:

for(int i = 1; i < 21; i++) { 
     char path[MAX_INTEGER_LENGTH + sizeof(szPostfix) + 1]; 
     sprintf(path,"%d%s",i, szPostfix); 
     cards[i] = new Card(i,path); 
    } 

在此,循環應該從020爲:

for(int i = 1 ; i < 21; i++) //incorrect - original code 

for(int i = 0 ; i < 20; i++) //correct - fix 

而且修復後,您可以使用i+1代替i在:

 sprintf(path,"%d%s",i+1, szPostfix); 
     cards[i] = new Card(i+1,path); 

如果這是必需的。