2011-10-01 133 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); 

如果这是必需的。