result obtained does not match the actual result

2

I'm struggling and I do not know how to explain, excuse me for the title of the doubt, here's the code defined ...

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

#define MAX_JOGADOR       7//numero maximo de jogadores
#define MAX_BOLA_JOGADOR  2//numero maximo de bolas para cada jogador
#define MAX_BOLA          5//numero maximo de bolas para jogo

typedef struct BOLA BOLA;
typedef struct JOGADOR JOGADOR;
typedef struct CAMPO CAMPO;

struct BOLA {//cada bola
    int num_bola; //contem um numero de bola
};

struct JOGADOR {//cada jogador
    int num_jogador; //contem um numero de jogador
    struct BOLA bola[MAX_BOLA_JOGADOR]; //entre uma a duas bolas
    int qt_bola_jogador; //quantidade bola
};

struct CAMPO {
    struct JOGADOR jogadores[MAX_JOGADOR]; //contem no maximo 7 jogadores 
    struct BOLA bolas[MAX_BOLA]; //possui no maximo 5 bolas para cada jogo
};

struct JOGADOR novo_jogador; /*novo jogador*/
struct BOLA nova_bola; /*nova bola*/
struct BOLA *ptr_bola; /*apontador para  nova bola*/
struct JOGADOR *ptr_jogador; /*apontador para  novo jogador*/
struct CAMPO *ptr_campo; /*apontador para campo*/

void jogador_recebe_bola(void);
void criar_bola(void);
void criar_jogador(void);

In this function creates the players and adds to the pointer_field, and this function works perfectly

void criar_jogador(void) {

    int i, j; //identificador para incrementar criação de jogador

    //alocaçao de memoria para simular jogo
    ptr_campo = (CAMPO *) malloc(sizeof (ptr_campo));

    printf("\n--- JOGADOR ---\n");

    /* criar jogador*/
    for (i = 0, j = 0; i < MAX_JOGADOR; i++) {
        novo_jogador.num_jogador++; //incrementa o numero de jogador
        novo_jogador.qt_bola_jogador = 0;
        ptr_jogador = &novo_jogador;
        ptr_campo->jogadores[i] = *ptr_jogador; //adicionar o jogador no campo
        printf(">> Criando jogador %d...\n\n", ptr_campo->jogadores[i].num_jogador);
        j++;
    }

    if (j == MAX_JOGADOR) {
        //criar bola
        criar_bola();
    }
}

In this function, you create the ball and add it to the pointer_field, and this function also works correctly

void criar_bola(void) {

    int k, m; //identificador para incrementar criação de bola

    printf("\n--- BOLA ---\n");

    /*cria bola*/
    for (k = 0, m = 0; k < MAX_BOLA; k++) {
        nova_bola.num_bola++; //incrementa o numero da bola
        ptr_bola = &nova_bola;
        ptr_campo->bolas[k] = *ptr_bola; //atribuir a baliza para cada jogador
        printf(">> Criar bola %d...\n\n", ptr_campo->bolas[k].num_bola);
        m++;
    }

    if (m == MAX_BOLA) {
        //criar bola
        jogador_recebe_bola();
    }
}

My question is, in this function player receives ball, the function works when the number of balls is 1 and / or 2 balls, and if in case it is 3 balls, as shown in the image below, the code, instead of say that the player has ball # 3, says he has ball # 4 and when it is selected does nothing ...

void jogador_recebe_bola(void) {

    int recebe_bola = 0;
    int j, m;
    srand(time(NULL));

    printf("\n--- JOGADOR RECEBE BOLA---\n");

    //faz um loop
    for (m = 0; m < MAX_BOLA; m++) {
        //captura a bola
        if (m + 1 == ptr_campo->bolas[m].num_bola) {
            //escolhe um jogador aleatorio
            recebe_bola = 1 + rand() % MAX_JOGADOR;
            ////faz um loop
            for (j = 0; j < MAX_JOGADOR; j++) {
                //captura o jogador a receber bola
                if ((j + 1 == ptr_campo->jogadores[j].num_jogador)
                        //jogador escolhido igual ao que está no campo
                        && (recebe_bola == ptr_campo->jogadores[j].num_jogador)) {
                    //escolhe o jogador x
                    printf(">> Jogador %d foi escolhido para receber bola %d...\n",
                            ptr_campo->jogadores[j].num_jogador, m + 1);
                    //recebe a bola do campo
                    ptr_campo->jogadores[j].bola[m] = ptr_campo->bolas[m];
                    //incrementa a quantidade de bola
                    ptr_campo->jogadores[j].qt_bola_jogador++;
                    //a bola nº y foi para jogador x
                    printf("\t>> Bola %d foi para jogador %d...\n",
                            ptr_campo->bolas[m].num_bola,
                            ptr_campo->jogadores[j].num_jogador);
                    //o jogador x tem bola nºy
                    printf(">> Jogador %d tem a bola %d...\n\n",
                            ptr_campo->jogadores[j].num_jogador,
                            ptr_campo->jogadores[j].bola[m].num_bola);
                }
            }
        }
    }
}

Review the code working on ideone

    
asked by anonymous 17.11.2015 / 01:03

1 answer

1

I did not get a complete solution, but I discovered the cause of the problem. As I do not understand its application, I do not know what is intentional and what is not, but what happens is that, in the third iteration, the variable in ptr_campo->jogadores[j].qt_bola_jogador and the variable ptr_campo->jogadores[j].bola[m].num_bola have the same memory address, then incrementing one increments the other. This only happens in the third iteration, for some reason.

So it's how you exercise to figure out what's causing it, but since it can only be somewhere that has address assignments, it's not hard for anyone who understands the code, I guess.

    
18.11.2015 / 14:16