Проблема при назначении случайно сгенерированного int в массив через указатель в C - PullRequest
0 голосов
/ 22 апреля 2020

Когда я пытаюсь присвоить указателям значения, сгенерированные rand(), возникают некоторые проблемы.

Когда я назначаю произвольное значение указателю, оно показывает правильное значение в функции rand_cards(). Но когда я хочу увидеть результаты в другом месте, он показывает другое число. Будь то в функции flop() или main().

Иногда он показывает правильное значение и в flop(), но неверно в main().

В чем проблема?

bool card_exists[12][4] = {false};

int table_ranks[5] = {0};
int table_aces[5] = {0};

// We will use these addresses to store random numbers in arrays above.
int *table_ranks_pos = table_ranks; 
int *table_aces_pos = table_aces;

int main(void) {

    srand((unsigned) time(NULL));

    flop();

    // Printing all elements of table_ranks
    for (int i = 0; i < 3; i++)
        printf("%d ", table_ranks[i]);
    printf("\n");

    return 0;
}

void flop() {
    while (table_ranks_pos < table_ranks+3 && table_aces_pos < table_aces+3) {

        rand_cards(table_ranks_pos, table_aces_pos); // Passing addresses as parameters

        // Printing value of address which we used previously
        printf("\nFlop %d = %p\n\n", *table_ranks_pos, table_ranks_pos);

        table_ranks_pos++;
        table_aces_pos++;

    }
}

void rand_cards(int *rank_addr, int *ace_addr) {
    int rand_rank, rand_ace;

    do {
        rand_rank = rand()%13+2;
        rand_ace = rand()%4+1;

        if (!card_exists[rand_rank][rand_ace]) {
            *rank_addr = rand_rank;
            printf("Rand %d = %d = %d = %p = %p = ", rand_rank, *rank_addr, *table_ranks_pos, rank_addr, table_ranks_pos);
        }

    } while (card_exists[rand_rank][rand_ace]);

    card_exists[rand_rank][rand_ace] = true;
}

Здесь выводятся

Один выход:

Rand 10 = 10 = 10 = 0x559220064070 = 0x559220064070 = 
Flop 10 = 0x559220064070

Rand 2 = 2 = 2 = 0x559220064074 = 0x559220064074 = 
Flop 2 = 0x559220064074

Rand 13 = 13 = 13 = 0x559220064078 = 0x559220064078 = 
Flop 13 = 0x559220064078

10 16777218 13

Другой выход:

Rand 7 = 7 = 7 = 0x55966e907070 = 0x55966e907070 = 
Flop 7 = 0x55966e907070

Rand 13 = 13 = 13 = 0x55966e907074 = 0x55966e907074 = 
Flop 16777229 = 0x55966e907074

Rand 8 = 8 = 8 = 0x55966e907078 = 0x55966e907078 = 
Flop 8 = 0x55966e907078

7 16777229 8

1 Ответ

0 голосов
/ 22 апреля 2020

Я полагаю, что вы переполняете card_exists, и это происходит с перезаписью вашего table_ranks.

В вашем card_exists есть место для 12 × 4 элементов, но обе ваши rand() строки потенциально генерировать большие числа. Способ случайного генерирования действительных индексов будет rand() % 12 и rand() % 4 (напомним, что первый индекс равен 0), но вы можете просто увеличить размер массива card_exists при необходимости.

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