Функции, массивы и указатели C ++ - PullRequest
0 голосов
/ 04 августа 2020

Об этом уже много сказано, но никто не решил мою проблему или, может быть, я просто не понял ответов. Я просто пытаюсь вернуть массив из функции

Кроме того, мне приходится помещать все свои функции над основной функцией, что мне тоже кажется странным.

И вот что происходит, когда я пытаюсь использовать указатели:

    int * RookMoves(int startingPosition, bool isWhite, int theBoard[64]){
     int startingPositionXY[2] = { startingPosition % 8, (startingPosition - (startingPosition % 8)) / 8 };
     int possibleRookPositions[14];
     int possiblePosXY[2];
     int counter = 0;
     for (int h = 0; h < 2; h++)
     {
         int counter2 = 1;
         for (int j = 0; j < 2; j++)
         {
             counter2 *= -1;
             for (int i = 1; i < 8; i++)
             {
                 int other = startingPositionXY[h] + (i * counter2);
                 int hInverted = (h + abs(h - 1)) * abs(h - 1); // 0 + 1 * 1 = 1 but 1 + 0 * 0 = 0
                 if (other < 8 && other > -1)
                 {
                     possiblePosXY[h] = other;
                     possiblePosXY[hInverted] = startingPositionXY[hInverted];
                     int movesOneDim = possiblePosXY[0] + (possiblePosXY[1] * 8);
                     if (CalculateSameColor(isWhite, theBoard[movesOneDim])) {
                         possibleRookPositions[counter] = movesOneDim;
                         counter++;
                         if (CalculateEnemy(isWhite, theBoard[movesOneDim])) 
                         {
                             break;
                         }
                     }
                     else
                     {
                         break;
                     }
                 }
                 else
                 {
                     break;
                 }
             }
         }
     }

     for (int i = counter; i < 14; i++) //simply changing any unused elements to -1 for later recognition
     {
         possibleRookPositions[i] = -1;
     }
     cout << sizeof(possibleRookPositions) / sizeof(possibleRookPositions[0]) << ' '; // returns 14 just as it should
     return possibleRookPositions;
 }

int main()
{
    int testBoard[64];
    for (int i = 0; i < 64; i++) {
        testBoard[i] = 0;
    }


    int* arr = RookMoves(21, true, testBoard);

    cout << sizeof(arr) / sizeof(arr[0]); //ouputs: 1, should be 14
}

все, что в сети говорит, что указатель должен работать, но это не так, он возвращает массив размером 1.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Массив в C ++ в «простом» коде - это либо std :: vector, либо std :: array. Их можно вернуть без проблем. Я бы сказал, что ваша проблема в том, что вы пишете в основном C и называете это C ++. C ИМХО намного сложнее получить правильно для новичков - поэтому используйте тот факт, что у вас есть C ++, доступный для вашего использования!

Массивы в стиле C - это то, что, конечно, полностью понимает любой профессиональный программист на C ++, но всякий раз, когда я вынужден писать подобный код (из-за требований заказчиков), он почти никогда не проходит тесты с первой попытки. Так что не беспокойтесь: даже люди, которые могут написать компилятор, который мог бы взять этот код массива и выдавать сборку, все равно в какой-то степени не могут сделать это правильно. Он громоздкий, и ему почти нет места в сегодняшнем C ++.

0 голосов
/ 04 августа 2020

Я пытался получить sizeof из указателя, потому что я еще не совсем понимаю, как они работают, но все, что мне нужно было сделать, это использовать указатели, а просто инициализировать массив, который я возвращал как «stati c». Спасибо MikeCAT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...