Невозможно изменить элементы в массиве с помощью функции

Я работаю над школьным проектом по разработке игры в покер. У меня есть код, который случайным образом генерирует карточки, но у меня возникают проблемы с использованием функций для их сортировки. Я считаю, что сам алгоритм работает, но я не уверен, как правильно получить доступ к переменным в массиве. Visual Studio выдает мне ошибки argument of type "int (*)[5] несовместим с параметром типа int *(*)[5] и 'void sortPokerHand(int *[][5])': cannot convert argument 1 from 'int [2][5]' to 'int *[][5]'.

Объявление pokerHand в main ()

int pokerHand[2][5];

Мои функции

//swap the two values
void swap(int* pokerHand, int* x, int* y)
{
  int tempVal = pokerHand[0][x];
  int tempSuit = pokerHand[1][x];
  pokerHand[0][x] = pokerHand[0][y];
  pokerHand[1][x] = pokerHand[1][y];
  pokerHand[0][y] = tempVal;
  pokerHand[1][y] = tempSuit;
}

void sortPokerHand(int* pokerHand[2][5])
{
   //bubble sort poker hand
   bool swapped;
   for (int i = 0; i < 4; i++)
   {
      swapped = false;
      for (int j = 0; j < (5 - i - 1); j++)
      {
        if (pokerHand[0][j] > pokerHand[0][j + 1])
        {
            swap(pokerHand[2][5], pokerHand[0][j], pokerHand[0][j + 1]);
            swapped = true;
        }
      }

      // If no two elements were swapped by inner loop, then break 
      if (swapped == false)
        break;
   }
}

Как я пытаюсь использовать функцию

sortPokerHand(pokerHand);

Спасибо за любую помощь

По большей части это неправильно. int* pokerHand[2][5] - это массив из 2 массивов по 5 указателей int. * там быть не должно. Вы передаете int в функцию подкачки, которая, как объявлено, принимает int*, а затем в этой функции обрабатываете его как int (*)[n], где n должен быть int, но вы используете int*. Короче говоря, не особо не нуждается в исправлении. Если это не вызывает предупреждений компилятора, вам серьезно нужно поднять уровень предупреждений до педантичных высот.

WhozCraig 26.10.2018 21:15

«// покерная комбинация пузырьковой сортировки» - Почему? Что не так с std::sort?

Jesper Juhl 26.10.2018 21:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
75
3

Ответы 3

Измените int * pokerHand [2] [5] на int ** pokerHand.

Наверное, все равно не получится. int [][] не совместим с int**

user4581301 26.10.2018 21:37

Пошел, вероятно, потому что я не видел определения pokerHand в вопросе. int pokerHand[2][5]; уж точно не влезет в int**.

user4581301 26.10.2018 21:56

@ user4581301 Посмотрите в начало вопроса.

WhozCraig 26.10.2018 22:09

Вы делаете это намного, намного труднее, чем следовало бы. Примите во внимание следующие предварительные условия:

  • «Рука» - это последовательность из пяти значений int.
  • Только карты в одной руке сортируются относительно друг друга.

Учитывая это, ваша процедура swap полностью неверна. Он должен взять два int по адресу (то есть указатели на int) и использовать их для обмена содержимым:

void swapInt(int *left, int *right)
{
    int tmp = *left;
    *left = *right;
    *right = tmp;
}

Далее при сортировке мы сортируем руку Один. Это означает последовательность Один из пяти int. Следовательно, нет необходимости передавать массивы массивов, указатели на массивы, массивы указателей или что-либо подобное. Просто сделайте это, чисто и просто:

// assumption: a hand has five cards
void sortPokerHand(int hand[])
{
    // bubble sort sequence of int
    size_t len = 5;
    bool swapped = true;
    while (swapped && len-- > 0)
    {
        swapped = false;
        for (size_t i = 0; i < len; ++i)
        {
            if (hand[i] > hand[i + 1])
            {
                swapInt(hand + i, hand + i + 1); // note: uses our new swap function
                swapped = true;
            }
        }
    }
}

Наконец, нам нужны какие-то руки, и обе они нуждаются в сортировке. Ради этого примера я объявляю их в main() как встроенный массив массивов, а затем делаю два вызова для их фактической сортировки, по одному за раз. Однако для начала нам понадобится функция печати:

void printHand(const int hand[])
{
    fputc('{', stdout);
    for (size_t i = 0; i < 5; ++i)
        printf("%d ", hand[i]);
    puts("}");
}

Достаточно просто. Сейчас main()

int main()
{
    int  hands[2][5] = 
    {
        { 5,10,7,4,1 },
        { 3,6,8,2,9 }
    };

    for (size_t i = 0; i < 2; ++i)
    {
        sortPokerHand(hands[i]);
        printHand(hands[i]);
    }

    return EXIT_SUCCESS;
}

Результат этой программы:

{1 4 5 7 10 }
{2 3 6 8 9 }

Точно так, как мы и ожидали.

Вот и все. В более общих решениях у нас был бы произвольный размер руки, и мы должны были бы задействовать его с помощью функций сортировки и печати, чтобы обеспечить полную и правильную работу. Зная, что это статический размер пять, сделать это немного проще.

Также обратите внимание, что вы можете полностью изменить определение hands, чтобы использовать указатели на массивы, а не массивы массивов, или даже указатели на указатели, и он все равно будет работать, если в sortHand и / или printHand будет использоваться int*. указывая на пять значений int.

Настоящий вопрос будет заключаться в том, как вообще у вас получится что-то вроде int *pokerHand[2][5].

Одна из сильных сторон C++ - это довольно богатая система типов. Если бы я делал это, я бы, наверное, начал с определения типа карты:

class card {
    enum { clubs, diamonds, spades, hearts } suit;
    int value; // 1-13 = Ace - King
public:
    bool operator<(card const &other) { 
        if (suit < other.suit)
            return true;
        if (other.suit < suit)
            return false;
        return value < other. value;
    }
};

Итак, этот operator< сортируется сначала по масти, затем по достоинству в пределах масти, поэтому все карты одной масти будут отсортированы вместе.

Таким образом, покерная комбинация обычно состоит из пяти карт, поэтому у нас просто есть:

std::vector<card> poker_hand;

Сортировка раздачи выглядит примерно так:

std::sort(poker_hand.begin(), poker_hand.end());

Если вы хотите написать свою собственную процедуру сортировки, вы, очевидно, можете, но в итоге все равно получится довольно тривиально - одномерный вектор карточек, который вы просто сравниваете напрямую, например:

if (secondCard < firstCard) 
    swap(secondCard, firstCard);

Другие вопросы по теме