Инициализация массива указателей - PullRequest
0 голосов
/ 01 октября 2011

У меня есть объект 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(...), но он как-то выглядит мне правильно.

Буду признателен за любые предложения.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я знаю, что для большинства этих вещей я должен использовать стандартную библиотеку, но я пытаюсь научить себя сложномупервый.Это просто способ, которым я учусь.

РЕДАКТИРОВАТЬ: Я исправил проблему с индексом.Теперь я просто должен выяснить, почему какое-то изображение не рисуется сейчас ...: / Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 01 октября 2011

У вашего кода много проблем

  1. Вы выполняете цикл с 1 <= i <= 20, но для массива из 20 элементов индексация начинается с 0 <= index <= 19. Вам нужно использовать cards[i-1] = new Card(i,path);

  2. Вы выделяете массив указателей cards, но вы не освобождаете его (утечка памяти). Либо освободите его с помощью delete[] cards;, как только вы закончите, либо просто используйте массив на основе стека с Card *cards[20]; вместо выделения с помощью new.

  3. То, как вы вычисляете MAX_INTEGER_LENGTH, показывает, что вы на самом деле не понимаете, что делает sizeof.

  4. Это причина, по которой карты не перемешиваются. Вы написали функцию, которая меняет два указателя, но указатели, которые она меняет, являются локальными переменными (параметрами) функции, а не элементами массива. Одним из решений является передача параметров в виде указателя , ссылки путем объявления свопа с void Swap(Card *& a, Card *& b), другое решение - передача указателей на указатели (но для этого потребуется более сложный синтаксис реализации из-за двойной косвенности и также потребуется изменить способ вызова функции).

1 голос
/ 01 октября 2011

В первом цикле for ваш начальный индекс равен 0, а во втором цикле for начальный индекс равен 0. Это может быть проблемой.

0 голосов
/ 01 октября 2011

Ваш код:

 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);
    }

Здесь цикл должен начинаться с 0 до 20 как:

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

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

И после исправления вы можете использовать i+1вместо i in:

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

, если это требуется.

...