Correction de la position des étoiles de pointeurs
This commit is contained in:
parent
f7378d4707
commit
c0de61b95a
|
@ -9,7 +9,7 @@
|
||||||
* Écrire sur la sortie standard à la manière de printf,
|
* Écrire sur la sortie standard à la manière de printf,
|
||||||
* seulement si le mode verbeux est actif
|
* seulement si le mode verbeux est actif
|
||||||
*/
|
*/
|
||||||
void printVerbose(const char *format, ...);
|
void printVerbose(const char* format, ...);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Active ou désactive l'affichage des messages verbeux
|
* Active ou désactive l'affichage des messages verbeux
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
|
|
||||||
#include "huftree.h"
|
#include "huftree.h"
|
||||||
|
|
||||||
void compress(const char *filepath);
|
void compress(const char* filepath);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,7 +21,8 @@ struct HufVertex {
|
||||||
// Pointeurs vers les deux enfants de ce sommet. Ils valent tous
|
// Pointeurs vers les deux enfants de ce sommet. Ils valent tous
|
||||||
// deux NULL si le sommet est une feuille. À noter qu'un sommet
|
// deux NULL si le sommet est une feuille. À noter qu'un sommet
|
||||||
// a toujours 0 ou 2 enfants car un arbre de Huffman est binaire
|
// a toujours 0 ou 2 enfants car un arbre de Huffman est binaire
|
||||||
HufVertex *child_l, *child_r;
|
HufVertex* child_l;
|
||||||
|
HufVertex* child_r;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -30,7 +31,7 @@ struct HufVertex {
|
||||||
typedef struct HufTree HufTree;
|
typedef struct HufTree HufTree;
|
||||||
struct HufTree {
|
struct HufTree {
|
||||||
// Pointeur sur la racine de l'arbre
|
// Pointeur sur la racine de l'arbre
|
||||||
HufVertex *root;
|
HufVertex* root;
|
||||||
|
|
||||||
// Quantité de sommets dans l'arbre
|
// Quantité de sommets dans l'arbre
|
||||||
size_t size;
|
size_t size;
|
||||||
|
@ -42,7 +43,7 @@ struct HufTree {
|
||||||
*
|
*
|
||||||
* (résultat à libérer avec `freeTree`)
|
* (résultat à libérer avec `freeTree`)
|
||||||
*/
|
*/
|
||||||
HufTree createTree(double *frequencies);
|
HufTree createTree(double* frequencies);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Libérer la mémoire occupée par un arbre de Huffman
|
* Libérer la mémoire occupée par un arbre de Huffman
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
static int is_verbose = FALSE;
|
static int is_verbose = FALSE;
|
||||||
|
|
||||||
void printVerbose(const char *format, ...) {
|
void printVerbose(const char* format, ...) {
|
||||||
if (is_verbose) {
|
if (is_verbose) {
|
||||||
va_list args_list;
|
va_list args_list;
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
*/
|
*/
|
||||||
static double* _createFrequencies(const char*);
|
static double* _createFrequencies(const char*);
|
||||||
|
|
||||||
double* _createFrequencies(const char *filepath) {
|
double* _createFrequencies(const char* filepath) {
|
||||||
double *frequencies = malloc(NUM_CHARS * sizeof(*frequencies));
|
double* frequencies = malloc(NUM_CHARS * sizeof(*frequencies));
|
||||||
int totalChars = 0;
|
int totalChars = 0;
|
||||||
|
|
||||||
for (size_t i = 0; i < NUM_CHARS; i++) {
|
for (size_t i = 0; i < NUM_CHARS; i++) {
|
||||||
|
@ -25,7 +25,7 @@ double* _createFrequencies(const char *filepath) {
|
||||||
// Ouverture du fichier en lecture seule, et comptage
|
// Ouverture du fichier en lecture seule, et comptage
|
||||||
// des occurences de chaque caractère ASCII ainsi que
|
// des occurences de chaque caractère ASCII ainsi que
|
||||||
// du nombre total de caractères
|
// du nombre total de caractères
|
||||||
FILE *file = fopen(filepath, "r");
|
FILE* file = fopen(filepath, "r");
|
||||||
|
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
fprintf(
|
fprintf(
|
||||||
|
@ -53,9 +53,9 @@ double* _createFrequencies(const char *filepath) {
|
||||||
return frequencies;
|
return frequencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
void compress(const char *filepath) {
|
void compress(const char* filepath) {
|
||||||
printVerbose("Calcul des fréquences d'apparition de chaque caractère\n");
|
printVerbose("Calcul des fréquences d'apparition de chaque caractère\n");
|
||||||
double *frequencies = _createFrequencies(filepath);
|
double* frequencies = _createFrequencies(filepath);
|
||||||
|
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
printFrequenciesTable(frequencies, NUM_CHARS);
|
printFrequenciesTable(frequencies, NUM_CHARS);
|
||||||
|
|
|
@ -25,12 +25,12 @@ static char _safeChar(char input);
|
||||||
void printTree(HufTree tree) {
|
void printTree(HufTree tree) {
|
||||||
// Allocation d'un tampon suffisamment grand pour contenir
|
// Allocation d'un tampon suffisamment grand pour contenir
|
||||||
// les indentations des sommets les plus profonds de l'arbre
|
// les indentations des sommets les plus profonds de l'arbre
|
||||||
wchar_t *buffer = malloc(_maxDepth(*tree.root) * 4 * sizeof(*buffer));
|
wchar_t* buffer = malloc(_maxDepth(*tree.root) * 4 * sizeof(*buffer));
|
||||||
_printVertex(*tree.root, buffer, 0);
|
_printVertex(*tree.root, buffer, 0);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _printVertex(HufVertex vert, wchar_t *buffer, int length) {
|
void _printVertex(HufVertex vert, wchar_t* buffer, int length) {
|
||||||
if (vert.child_l != NULL && vert.child_r != NULL) {
|
if (vert.child_l != NULL && vert.child_r != NULL) {
|
||||||
// Affichage d'un sommet avec enfants, on montre
|
// Affichage d'un sommet avec enfants, on montre
|
||||||
// la probabilité somme des enfants
|
// la probabilité somme des enfants
|
||||||
|
|
|
@ -44,7 +44,7 @@ HufTree createTree(double* frequencies) {
|
||||||
// Allocation d'un tableau de `leaves_count` pointeurs vers sommets.
|
// Allocation d'un tableau de `leaves_count` pointeurs vers sommets.
|
||||||
// Initialement, ce tableau contient les feuilles du futur arbre.
|
// Initialement, ce tableau contient les feuilles du futur arbre.
|
||||||
// Chaque feuille correspond à un caractère du corpus original
|
// Chaque feuille correspond à un caractère du corpus original
|
||||||
HufVertex **remaining = malloc(leaves_count * sizeof(*remaining));
|
HufVertex** remaining = malloc(leaves_count * sizeof(*remaining));
|
||||||
size_t next_index = 0;
|
size_t next_index = 0;
|
||||||
|
|
||||||
for (size_t i = 0; i < NUM_CHARS; i++) {
|
for (size_t i = 0; i < NUM_CHARS; i++) {
|
||||||
|
@ -77,11 +77,11 @@ HufTree createTree(double* frequencies) {
|
||||||
&min_vert_index, &sec_min_vert_index
|
&min_vert_index, &sec_min_vert_index
|
||||||
);
|
);
|
||||||
|
|
||||||
HufVertex *min_vert = remaining[min_vert_index];
|
HufVertex* min_vert = remaining[min_vert_index];
|
||||||
HufVertex *sec_min_vert = remaining[sec_min_vert_index];
|
HufVertex* sec_min_vert = remaining[sec_min_vert_index];
|
||||||
|
|
||||||
// Création d'un sommet parent P pour A et B
|
// Création d'un sommet parent P pour A et B
|
||||||
HufVertex *parent = malloc(sizeof(*parent));
|
HufVertex* parent = malloc(sizeof(*parent));
|
||||||
|
|
||||||
parent->frequency = min_vert->frequency + sec_min_vert->frequency;
|
parent->frequency = min_vert->frequency + sec_min_vert->frequency;
|
||||||
parent->child_l = min_vert;
|
parent->child_l = min_vert;
|
||||||
|
@ -110,8 +110,8 @@ HufTree createTree(double* frequencies) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _findMinimalVertices(
|
void _findMinimalVertices(
|
||||||
HufVertex **vertices, size_t size,
|
HufVertex** vertices, size_t size,
|
||||||
size_t *min_index, size_t *sec_min_index
|
size_t* min_index, size_t* sec_min_index
|
||||||
) {
|
) {
|
||||||
// Initialisation de telle sorte qu'initialement
|
// Initialisation de telle sorte qu'initialement
|
||||||
// on ait `freq(min_index) < freq(sec_min_index)`
|
// on ait `freq(min_index) < freq(sec_min_index)`
|
||||||
|
@ -144,7 +144,7 @@ void freeTree(HufTree tree) {
|
||||||
tree.root = NULL;
|
tree.root = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _freeTreeVertex(HufVertex *vert) {
|
void _freeTreeVertex(HufVertex* vert) {
|
||||||
if (vert->child_l != NULL && vert->child_r != NULL) {
|
if (vert->child_l != NULL && vert->child_r != NULL) {
|
||||||
_freeTreeVertex(vert->child_l);
|
_freeTreeVertex(vert->child_l);
|
||||||
_freeTreeVertex(vert->child_r);
|
_freeTreeVertex(vert->child_r);
|
||||||
|
|
|
@ -24,15 +24,15 @@ static struct argp_option options[] = {
|
||||||
*/
|
*/
|
||||||
typedef struct Args {
|
typedef struct Args {
|
||||||
int verbose;
|
int verbose;
|
||||||
char **files;
|
char** files;
|
||||||
} Args;
|
} Args;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fonction de rappel pour interpréter les arguments
|
* Fonction de rappel pour interpréter les arguments
|
||||||
* passés au programme
|
* passés au programme
|
||||||
*/
|
*/
|
||||||
static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
static error_t parse_opt(int key, char* arg, struct argp_state* state) {
|
||||||
Args *args = state->input;
|
Args* args = state->input;
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case 'V':
|
case 'V':
|
||||||
|
|
Loading…
Reference in New Issue