1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным.
В описании темы указываем язык!!!
всем доброго времени суток. Такое дело, преподаватель наш сначало зотел сагитировать нас на написание архиваторпо методу Хаффмана, но потом понял, что для специальностей оооочень далёких от информационных это видимо для первог окурса слишком и скзаал найти исходники и разобраться, типо поспрашивате на понимание и, заставит чего нить дописать самим. Во таткие вот дела. Нижек я предоставлю найденый мной исходник, очень прошу каждого кто имеет время и знания закомментировать, объяснить его работу или может предложить другой исходник, который более понятен и т.п.... Ещё мне кажется, что это тисходник не содержит декодера, это действительно так? Сложно ли его реализовать, если нет, то оочень прошу помочь 0 для нас это просто неподнимаемо....
for (i = 0; i < END_OF_STREAM; i++) tree->leaf[ i ] = -1; }
void EncodeSymbol (TREE *tree, unsigned int c, COMPRESSED_FILE *output) { unsigned long code; unsigned long current_bit; int code_size; int current_node;
void UpdateModel (TREE *tree, int c) { int current_node; int new_node;
if (tree->nodes[ ROOT_NODE].weight == MAX_WEIGHT) RebuildTree(tree); current_node = tree->leaf[ c ]; while (current_node != -1) { tree->nodes[ current_node ].weight++; for (new_node = current_node; new_node > ROOT_NODE; new_node--) if (tree->nodes[ new_node - 1 ].weight >= tree->nodes[ current_node ].weight) break; if (current_node != new_node) { swap_nodes(tree, current_node, new_node); current_node = new_node; } current_node = tree->nodes[ current_node ].parent; } }
void RebuildTree (TREE *tree) { int i; int j; int k; unsigned int weight;
printf("R"); j = tree->next_free_node - 1; for (i = j; i >= ROOT_NODE; i--) { if (tree->nodes[ i ].child_is_leaf) { tree->nodes[ j ] = tree->nodes[ i ]; tree->nodes[ j ].weight = (tree->nodes[ j ].weight + 1) / 2; j--; } }
for (i = tree->next_free_node - 2; j >= ROOT_NODE; i -= 2, j--) { k = i + 1; tree->nodes[ j ].weight = tree->nodes[ i ].weight + tree->nodes[ k ].weight; weight = tree->nodes[ j ].weight; tree->nodes[ j ].child_is_leaf = FALSE; for (k = j + 1; weight < tree->nodes[ k ].weight; k++) ; k--; memmove(&tree->nodes[ j ], &tree->nodes[ j + 1 ], (k - j) * sizeof(struct node)); tree->nodes[ k ].weight = weight; tree->nodes[ k ].child = i; tree->nodes[ k ].child_is_leaf = FALSE; }
for (i = tree->next_free_node - 1; i >= ROOT_NODE; i--) { if (tree->nodes[ i ].child_is_leaf) { k = tree->nodes[ i ].child; tree->leaf[ k ] = i; } else { k = tree->nodes[ i ].child; tree->nodes[ k ].parent = tree->nodes[ k + 1 ].parent = i; } } }
void swap_nodes (TREE *tree, int i, int j) { struct node temp;
if (tree->nodes[ i ].child_is_leaf) tree->leaf[ tree->nodes[ i ].child ] = j; else { tree->nodes[ tree->nodes[ i ].child ].parent = j; tree->nodes[ tree->nodes[ i ].child + 1 ].parent = j; } if (tree->nodes[ j ].child_is_leaf) tree->leaf[ tree->nodes[ j ].child ] = i; else { tree->nodes[ tree->nodes[ j ].child ].parent = i; tree->nodes[ tree->nodes[ j ].child + 1 ].parent = i; } temp = tree->nodes[ i ]; tree->nodes[ i ] = tree->nodes[ j ]; tree->nodes[ i ].parent = temp.parent; temp.parent = tree->nodes[ j ].parent; tree->nodes[ j ] = temp; }
void add_new_node (TREE *tree, int c) { int lightest_node; int new_node; int zero_weight_node;
С алгоритмом, т.е. теорией, более или мене разобрался, желательно именно комментарии построчные, что от куда вытекает, где что происходит, в таком вот стиле... А на счёт вопроса моего про декодер - его реально нет?
Друзья, понимаю, что выполнить вторую мою прозьбу сложно даже для специалистов - написать декодер адаптивного Хаффмана, но хоть закоментить кодовый код можно?
декодирует закодированный файл. Другое дело, что в main осуществляется вызов из командной строки только кодера, поэтому там нужно реализовать возможность выбора, например
int main (int argc, char *argv[]) { COMPRESSED_FILE *output; FILE *input; if (argc<4) { printf("\nИспользование: <имя EXE файла> <d/e> <Входной файл> <Выходной файл>\n"); exit(0); } if (argv[1] [0] == 'e') CompressFile(argv[2], argv[3]); else if (argv [1] [0] == 'd') ExpandFile(argv[2], argv[3]); exit(0); }
То есть в зависимости от того, что пользователь введет в командной строке, будет вызываться кодер или декодер ...
Сообщение отредактировано: Тёмный Эльф - 11.04.2007 20:52
спосибо огромное, очень прошу некоторых комменатриеви по остальным функцим- ведь нам надо показать что мы поняли кажду строчку, а по такому сложно примеру понимать очень сложно....