C Blackjack Lab, проблемы с указателями - PullRequest
0 голосов
/ 22 мая 2018

Мне жаль, что это не так подробно, как следовало бы, но я невероятно ограничен во времени.Я пытаюсь написать программу, которая имитирует игру в Блэкджек, используя символы, которые представляют карты из входного файла (имитируя колоду).Я еще не закончил, но, как я уже сказал, у меня почти нет времени, чтобы напечатать это.У меня, в частности, возникают проблемы с использованием указателей и кода ошибки, связанного с оператором if в main ().в нем говорится, что у ranOut (предполагается, что он используется для завершения игры, когда в файле заканчивается карта, представленная в файле как 0), было выдано исключение: нарушение прав доступа для чтения, nullptr.Я извиняюсь, если это тривиально, но я все еще плохо знаком с C, и указатели - проклятие моего существования.Вот мой код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


FILE *fpOut;
FILE *fpIn;

#define TRUE 1
#define FALSE 0

int playHand(int *dealerTotal, int *playerTotal, int *ranOut); //Plays one hand

int getCard(int total); //Reads next card from input, assigns value to points

int main() {

if (!(fpOut = fopen("csis.txt", "w")))
{
    printf("csis.txt could not be opened for output.");
    exit(1);
}


if (!(fpIn = fopen("cards.txt", "r")))
{
    printf("cards.txt could not be opened for input.");
    exit(1);
}

int *dealerTotal = 0; //Initialize variables to count wins
int *playerTotal = 0;

int *ranOut = 0; //ends loop

while (1)
{
    playHand(dealerTotal, playerTotal, ranOut);

    if (*ranOut == TRUE)
        break;
}

printf("Total Dealer Wins: %d", *dealerTotal);
printf("Total Player Wins: %d", *playerTotal);

fclose(fpIn);
fclose(fpOut);
getchar();

return 0;
}

int playHand(int *dealerTotal,int *playerTotal, int *ranOut)
{
int pCard[10] = { 0 };
int dCard[10] = { 0 };
int dWin = 0;
int pWin = 0;
int i = 0;
int dFin = 0;
int pFin = 0;

while (i < 10)
{
    int sumP = pCard[0] + pCard[1] + pCard[2] + pCard[3] + pCard[4] + 
pCard[5] + pCard[6] + pCard[7] + pCard[8] + pCard[9];
    int sumD = dCard[0] + dCard[1] + dCard[2] + dCard[3] + dCard[4] + 
dCard[5] + dCard[6] + dCard[7] + dCard[8] + dCard[9];

    if (sumP <= 15)
    {
        pCard[i] = getCard(sumP);
    }
    else
        pFin = TRUE;
    if (sumD <= 16)
    {
        dCard[i] = getCard(sumD);
    }
    else
        dFin = TRUE;

    if (pCard[i] == 42 || dCard[i] == 42)
    {
        *ranOut = TRUE;
        break;
    }

    sumP = pCard[0] + pCard[1] + pCard[2] + pCard[3] + pCard[4] + pCard[5] + 
pCard[6] + pCard[7] + pCard[8] + pCard[9];
    sumD = dCard[0] + dCard[1] + dCard[2] + dCard[3] + dCard[4] + dCard[5] + 
dCard[6] + dCard[7] + dCard[8] + dCard[9];

    if (sumP > 21 || sumD == 21)
    {
        dWin = TRUE;
        pWin = FALSE;
    }
    else if (sumD > 21 || sumP == 21)
    {
        dWin = FALSE;
        pWin = TRUE;
    }
    else if (dFin && pFin)
    {
        if ((21 - sumP) > (21 - sumD))
        {
            dWin = TRUE;
            pWin = FALSE;
        }
        else
        {
            dWin = FALSE;
            pWin = TRUE;
        }
    }



    if (dWin)
    {
        *dealerTotal++;
        break;
    }
    else if (pWin)
    {
        *playerTotal++;
        break;
    }

    i++;
} 

return 1;

}

int getCard(int total)
{
char x;
int y = 0;


if (!feof(fpIn))
{
    x = fgetc(fpIn);
    switch (x) 
    {
        case '0':
            y = 42;
            break;

        case '1':
            y = 1;
            break;
        case '2':
            y = 2;
            break;
        case '3':
            y = 3;
            break;
        case '4':
            y = 4;
            break;
        case '5':
            y = 5;
            break;
        case '6':
            y = 6;
            break;
        case '7':
            y = 7;
            break;
        case '8':
            y = 8;
            break;
        case '9':
            y = 9;
            break;
        case 'T':
            y = 10;
            break;
        case 'K':
            y = 10;
            break;
        case 'Q':
            y = 10;
            break;
        case 'J':
            y = 10;
            break;
        case 'A':
            if(total > 10)
            y = 1;
            else if (total >= 10)
                y = 11;
            break;
    }
}
return y;
}

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы должны выбрать между:

  1. Используя ranOut в качестве int * и, таким образом, динамически распределять пространство для него в куче, используя malloc.
  2. Используя ranOutкак int и, таким образом, передавая свой адрес &ranOut функциям, для которых требуется указатель.

Второй вариант звучит проще для меня.Но первый - это рекомендуемый способ

int realRanOut;
int *ranOut;
ranOut = &realRanOut;

Так что ranOut теперь указывает на инициализированную область памяти.

0 голосов
/ 22 мая 2018
int *ranOut = 0; //ends loop

Здесь объявляется целочисленный указатель, указывающий на 0, поэтому это указатель NULL.

Попробуйте объявить ranOut как целое число

int ranOut = 0; //ends loop

Затем передайте его адрес playHand()

playHand(dealerTotal, playerTotal, &ranOut);

И, конечно, получите доступ к нему как целое число в Main()

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