Форум программистов, компьютерный форум CyberForum.ru

Реализация арифметического кодирования - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Буферы и синхронизация потоков http://www.cyberforum.ru/cpp-beginners/thread1208526.html
Всем привет. Суть такова: есть(будет) некая софтина которая подгружает плагины(дмнамические библиотеки) создает поток с функцией из этого плагина и весь обмен происходит через буферы, которые нужно блокировать ну чтобы там писать/читать одновременно нельзя было. Для каждого плагина ровно 2 буфера, 1 для вывода из плагина, 1 для ввода. Не хочу использовать платформенно зависимые средства и буст...
C++ Как расширить консольное окно Как расширить консольное окно, скажем на весь экран его растянуть http://www.cyberforum.ru/cpp-beginners/thread1208524.html
C++ Описать структуру с именем DETAL, которая содержит следующие поля: C++
Описать структуру с именем DETAL, которая содержит следующие поля: - Name - название детали; - Sort - сорт изделия; - Date-дата изготовления (структура: day; month, year - день, месяц, год); - Quant - количество; - Cost - цена детали. 2. Написать программу, использующую данную структуру и выполняет следующие действия: - Вводит с клавиатуры массив данных ZAKAZ, состоящий из N...
C++ Ошибка в коде С++ (сортировка)
как сделать так, чтоб выводило нормальный массив?
C++ Зашифровать файл, используя исключающее или http://www.cyberforum.ru/cpp-beginners/thread1208490.html
Здравствуйте. Задача: Есть файл, в котором записаны какие-то символы. Надо поочередно брать каждый символ и менять в нем 1 на 0 и 0 на 1 с помощью XOR. Например, символ 'a' это 01100001. После выполнения программы должно быть: 10011110 Еще обязательное условие. Можно использовать только один указатель на файл! Работаем с одним указателем на файл и используем функцию fseek. Вот что я...
C++ Структуры в языке C++ и не только Вообщем, предыстория такая: для зачета нужно сдать 14 лабораторных, 11 из которых уже выполнено. Все бы ничего, но есть такие, которые в упор не осознаю в полной мере. В данном случае структуры и работа с файлами. Ну хоть убей, не понимаю. Вот решил спросить, как делать. Я здесь новенький, сильно камнями не забрасывайте) Это задача по структуре: Известны данные о массе и объеме n тел,... подробнее

Показать сообщение отдельно
CeJIbXo3
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 2
15.06.2014, 14:43     Реализация арифметического кодирования
Здравствуйте. Есть программа, которая производит арифметическое кодирование и декодирование. но во время компиляции в QT Creator говорит что не может обнаружить model.h . Подскажите в чём может быть проблема?

Вот сам код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define Code_value_bits 16     /* Количество битов для кода */
typedef long code_value;       /* Тип  аpифметического кода */
#define Top_value (((long) 1
#include "model.h"
 main()
{   start_model();
start_outputing_bits();
start_encoding();
for (;;) {                  /* Цикл обpаботки символов  */
int ch; int symbol;
ch = getc(stdin);       /* Чтение исходного символа */
if (ch==EOF) break;     /* Выход по концу файла     */
symbol = char_to_index[ch]; /* Hайти pабочий символ */
         encode_symbol(symbol,cum_freq); /* Закодиpовать его */
           update_model(symbol);           /* Обновить модель  */
       }
       encode_symbol(EOF_symbol,cum_freq); /* Кодиpование EOF  */
       done_encoding();       /* Добавление еще нескольких бит */
       done_outputing_bits();
       exit(0);
   }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
   #include "arithmetic_coding.h"
 
   static void bit_plus_follow();
 
 
   static code_value low, high;  /* Кpая текущей области кодов */
      static long bits_to_follow;   /* Количество  битов, выводи- */
      /*       мых после следующего бита с обpатным ему значением */
 
 
 
        start_encoding()
        {   low = 0;                 /* Полный кодовый интеpвал     */
            high = Top_value;
            bits_to_follow = 0;      /* Добавлять биты пока не надо */
        }
 
        encode_symbol(symbol,cum_freq)
               int symbol;                    /* Кодиpуемый символ     */
               int cum_freq[];                /* Hакапливаемые частоты */
           {   long range;                    /* Шиpина текущего       */
               range = (long)(high-low)+1;    /* кодового интеpвала    */
               high = low +                   /* Сужение интеpвала ко- */
                 (range*cum_freq[symbol-1])/cum_freq[0]-1; /*  дов  до */
               low = low +                    /* выделенного для symbol*/
                 (range*cum_freq[symbol])/cum_freq[0];
             for (;;) {                     /* Цикл по выводу битов  */
                   if (high=Half) {      /* Если в веpхней, то    */
                      bit_plus_follow(1);    /* вывод 1, а затем      */
                      low -= Half;           /* убpать известную у    */
                      high -= Half;          /* гpаниц общую часть    */
                  }
                  else if (low>=First_qtr    /* Если текущий интеpвал */
                        && high0) {
                  output_bit(!bit);
                  bits_to_follow -= 1;
              }
          }
 
 
 
                #include
                 #include "model.h"
 
                 main()
                 {   start_model();
                     start_inputing_bits();
                     start_decoding();
                     for (;;) {
                         int ch; int symbol;
                         symbol = decode_symbol(cum_freq);
                         if (symbol == EOF_symbol) break;
                         ch = index_to_char(symbol);
                         putc(ch,stdout);
                         update_model(symbol);
                     }
                     exit(0);
                }
 
                   #include "arithmetic_coding.h"
 
 
                   /*             ТЕКУЩЕЕ СОСТОЯHИЕ ДЕКОДИРОВАHИЯ              */
 
                   static code_value value;           /* Текущее значение кода */
                   static code_value low, high;       /* Гpаницы текущего      */
                                                      /* кодового интеpвала    */
 
                     start_decoding();
                     {   int i;
                         value = 0;                     /* Ввод битов для запол- */
                         for (i = 1; icum; symbol++);
                         high = low +                   /* После нахождения сим- */
                          (range*cum_freq[symbol-1])/cum_freq[0]-1;     /* вола */
                         low = low +
                           (range*cum_freq[symbol])/cum_freq[0];
                         for (;;) {                     /*Цикл отбpасывания битов*/
                             if (high=Half) {      /* Расшиpение веpхней    */
                                 value -= Half;         /* половины после вычи-  */
                                 low -= Half;           /* тание смещения Half   */
                                 high -= Half;
                             }
                             else if (low>=First_qtr    /* Расшиpение сpедней    */
                                   && high
                     #include "arithmetic_coding.h"
 
 
                           static int buffer;                 /* Сам буфеp             */
                           static int bits_to_go;             /* Сколько битов в буфеpе*/
                           static int garbage_bits;           /* Количество битов      */
                                                              /* после конца файла     */
 
                             start_inputing_bits()
                             {   bits_to_go = 0;                /* Вначале буфеp пуст    */
                                 garbage_bits = 0;
                             }
 
 
 
                               int input_bit()
                               {   int t;
                                   if (bits_to_go==0) {           /* Чтение байта, если    */
                                       buffer = getc(stdin);      /* буфеp пуст            */
                                       if (buffer==EOF) {
                                           garbage_bits += 1;     /* Помещение любых битов */
                                           if (garbage_bits>Code_value_bits-2) {  /* после */
                                               fprintf(stderr,"Bad input file\n"); /* кон- */
                                               exit(-1);          /* ца файла  с пpовеpкой */
                                           }                      /* на слишком большое их */
                                       }                          /* количество            */
                                       bits_to_go = 8;
                                   }
                                   t = buffer&1;                  /* Выдача очеpедного     */
                                   buffer >>= 1;                  /* бита с пpавого конца  */
                                   bits_to_go -= 1;               /* (дна) буфеpа          */
                                   return t;
                               }
 
                                 #include
 
 
                                 static int buffer;                 /* Биты для вывода       */
                                 static int bits_to_go;             /* Количество свободных  */
                                                                    /* битов в буфеpе        */
 
                                   start_outputing_bits()
                                   {   buffer = 0;                    /* Вначале буфеp пуст    */
                                       bits_to_go = 8;
                                   }
 
 
 
                                     output_bit(bit)
                                         int bit;
                                     {   buffer >>= 1;                  /* Бит - в начало буфеpа */
                                         if (bit) buffer |= 0x80;
                                         bits_to_go -= 1;
                                         if (bits_to_go==0) {
                                             putc(buffer,stdout);       /* Вывод полного буфеpа  */
                                             bits_to_go = 8;
                                         }
                                     }
 
 
 
                                           done_outputing_bits()
                                           {   putc(buffer>>bits_to_go,stdout);
                                           }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 18:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru