132 lines
2.3 KiB
C
132 lines
2.3 KiB
C
#include <stdio.h> // à enlever après
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
|
|
#define Y_BLOCK_SIZE 10
|
|
|
|
|
|
typedef enum jeton {
|
|
VIDE = 0,
|
|
BLEU = 1,
|
|
ROUGE = 2
|
|
} jeton;
|
|
|
|
typedef struct colonne {
|
|
int hauteur;
|
|
int hauteur_max;
|
|
jeton* jetons;
|
|
} colonne;
|
|
|
|
void print_tab(jeton *tab, int n)
|
|
{
|
|
for (int i=0; i<n; i++)
|
|
printf("%p --> %x (%d)\n", &tab[i], tab[i], tab[i]);
|
|
printf("\n");
|
|
}
|
|
|
|
void print_colonne(colonne *col)
|
|
{
|
|
print_tab(col->jetons, col->hauteur_max);
|
|
}
|
|
|
|
void init_zeros(jeton* ptr, int count)
|
|
{
|
|
for (int i=0; i<count; i++)
|
|
{
|
|
printf("%p = 0\n", &ptr[i]);
|
|
ptr[i] = 0;
|
|
}
|
|
}
|
|
|
|
colonne *creer_colonne(int hauteur_max)
|
|
{
|
|
colonne *col = malloc(sizeof(colonne));
|
|
col->jetons = malloc(hauteur_max*sizeof(jeton));
|
|
init_zeros(col->jetons, hauteur_max);
|
|
|
|
col->hauteur_max = hauteur_max;
|
|
col->hauteur = 0;
|
|
|
|
return col;
|
|
}
|
|
|
|
bool agrandir_colonne(int diff_taille, colonne *col)
|
|
{
|
|
printf("J'appelle realloc.\n");
|
|
jeton* jetons_nouv = realloc(col->jetons, col->hauteur_max + diff_taille);
|
|
|
|
if (jetons_nouv == NULL)
|
|
return false; // allocation impossible, on garde col->jetons tel quel
|
|
|
|
// on met des zéros dans la partie nouvellement attribuée
|
|
init_zeros(jetons_nouv + col->hauteur_max, diff_taille);
|
|
|
|
|
|
printf("vérif travail init_zeros\n");
|
|
print_tab(jetons_nouv, col->hauteur_max + diff_taille);
|
|
|
|
// free est appelé par realloc et les éléments sont copiés par realloc
|
|
col->hauteur_max += diff_taille;
|
|
col->jetons = jetons_nouv;
|
|
|
|
//print_colonne(col);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
bool ajouter_jeton(jeton j, colonne *col)
|
|
{
|
|
printf("%d", col->hauteur);
|
|
if (col->hauteur >= col->hauteur_max)
|
|
{
|
|
if (!agrandir_colonne(Y_BLOCK_SIZE, col))
|
|
return false;
|
|
}
|
|
|
|
col->jetons[col->hauteur] = j;
|
|
col->hauteur++;
|
|
|
|
return true;
|
|
}
|
|
|
|
void detruire_colonne(colonne *col)
|
|
{
|
|
free(col->jetons);
|
|
free(col);
|
|
}
|
|
|
|
|
|
typedef struct grille {
|
|
int n_positifs;
|
|
colonne* positifs;
|
|
int n_negatifs;
|
|
colonne* negatifs;
|
|
} grille;
|
|
|
|
|
|
// =========================================== TEST =================================================
|
|
|
|
|
|
|
|
|
|
int main()
|
|
{
|
|
colonne *col = creer_colonne(Y_BLOCK_SIZE);
|
|
print_colonne(col);
|
|
|
|
for (int i=0; i<15; i++)
|
|
{
|
|
if (ajouter_jeton((i%2==0) ? ROUGE : BLEU, col))
|
|
printf("Jeton ajouté.\n");
|
|
else
|
|
fprintf(stderr, "Erreur dans l'ajout d'un jeton.\n");
|
|
}
|
|
|
|
print_colonne(col);
|
|
|
|
detruire_colonne(col);
|
|
|
|
return 0;
|
|
}
|