необъявленные идентификаторы уже объявлены?

Я работаю над проблемой для школы, и я получаю «необъявленный идентификатор» в каждой строке с моими массивами suitsInHand или FacesInHand. В последний раз это произошло из-за того, что я не объявлял свои переменные в верхней части блока, но, насколько я могу судить, это происходит не по той же причине. Может ли кто-нибудь сказать мне, что я сделал неправильно?

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SUITS 4
#define FACES 13
#define AVAILABLE 0
#define TAKEN 1

void dealACard(char *suits[], char *faces[], int deck[][FACES]);
void dealAHand(char *suits[], char *faces[], int deck[][FACES]);
void analyzeHand(char *suits[], char *faces[]);

int main(void){
    int suitsInHand[4] = {0};
    int facesInHand[13] = {0};
    char *suits[4] = {"Hearts", "Diamonds", "Spades", "Clubs"};
    char *faces[13] = {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace"};
    int deck[4][13] = {AVAILABLE};

    srand(time(NULL));
    dealAHand(suits, faces, deck);

    system("pause");
    return 0;
}

void dealAHand(char *suits[], char *faces[], int deck[][FACES]){
    int i;
    for(i=0;i<5;i++)
        dealACard(suits,faces,deck);
}

void dealACard(char *suits[], char *faces[], int deck[][FACES]){
    int suitIndex, faceIndex;
    memset(suitsInHand, 0, sizeof(suitsInHand));
    memset(facesInHand, 0, sizeof(facesInHand));

    suitIndex = rand() % 4;
    faceIndex = rand() % 13;
    while (deck[suitIndex][faceIndex]==TAKEN){
        suitIndex = rand() % 4;
        faceIndex = rand() % 13;
    }
    deck[suitIndex][faceIndex]=TAKEN;
    suitsInHand[suitIndex]++;
    facesInHand[faceIndex]++;

    printf("%s of %s.\n", faces[faceIndex], suits[suitIndex]);
}

void analyzeHand(char *suits[], char *faces[]){
    typedef enum {false, true} bool;
    int num_consec = 0;
    int rank, suit;
    bool straight = false;
    bool flush = false;
    bool four = false;
    bool three = false;
    int pairs = 0;

    for(suit=0;suit<SUITS;suit++)
        if(suitsInHand[suit]==5)
            flush = true;

    rank = 0;
    while (facesInHand[rank]==0)
        rank++;

    //for(;rank<FACES && facesInHand[rank]; rank++)
    //  num_consec++;

    if(num_consec == 5){
        straight = true;
        return;
    }

    for(rank = 0;rank<NUM_RANKS; rank++){
        if(facesInHand[rank]==4)
            four = true;
        if(facesInHand[rank]==3)
            three = true;
        if(facesInHand[rank]==2)
            pairs++;
    }

    if(straight == true && flush == true)
        printf("Straight flush.\n\n");
    else if(four == true)
        printf("Four of a kind.\n\n");
    else if(three == true && pairs == 1)
        printf("Full house.\n\n");
    else if(flush == true)
        printf("Flush.\n\n");
    else if(straight == true)
        printf("Straight.\n\n");
    else if(three == true)
        printf("Three of a kind.\n\n");
    else if(pairs == 2)
        printf("Two pairs.\n\n");
    else if(pairs == 1)
        printf("Pair.\n\n");
    else
        printf("High card.\n\n");


}

person user2030222    schedule 17.03.2013    source источник


Ответы (2)


Здесь:

void dealACard(char *suits[], char *faces[], int deck[][FACES]){
    int suitIndex, faceIndex;
    memset(suitsInHand, 0, sizeof(suitsInHand));

suitsInHand не объявлен в этой области. suitsInHand объявлен в области действия функции main, а не в области действия dealACard.

Чтобы исправить это, вы можете добавить в свои функции параметр для передачи suitsInHand или объявить suitsInHand в области файла.

То же самое относится и к facesInHand.

person ouah    schedule 17.03.2013

вы объявили suitsInHand в main, но это не означает, что он доступен для других функций, вам нужно передать его другим функциям, чтобы они имели к нему доступ.

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

Кроме того, в целом ваша функция DealACard потенциально очень и очень неприятна. Особенно, если в колоде только 1 карта, может потребоваться очень много времени, чтобы получить правильное случайное число для раздачи последней карты в колоде.

person Keith Nicholas    schedule 17.03.2013
comment
Я еще не начал со структур, но я посмотрю на это. Спасибо. - person user2030222; 18.03.2013