![]() |
|
|
![]()
|
|
| Асоишница |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 13.3.2012 Репутация: нет Всего: нет |
При компиляции выдаёт:
Необработанное исключение в "0x008c16dc" в "oit3архивация.exe": 0xC0000005: Нарушение прав доступа при чтении "0x008cf01c". ссылается на строчку в процедуре CODER() while (c != mass[i].simv) //находим символ в массиве mass вот код:
Код делает следующее: Есть текстовый файл. есть таблица кодов его символов, получена методом хафмена. Нужна заархивировать, а потом разархивировать файл. Сжатие: читаем текстовый файл.считали букву а. смотрим её код в файле кодов хафмена. пусть будет 00101 записали в массив из 8 чисел. осталось 3 позиции, считываем след. букву б: 0110. записываем получили: 00101011 0 т.е. один бит в следующую 8-ку переходит(байт). дешифровка аналогично: считали бит: 0- ищем код, если нет, считываем следудющий бит байта......прошли все 8 бит, считываем след. байт и к оставшимся с прошлого байта битам дописываем по одному биту пока не наберётся код, который есть в таблице кодов, чтобы заменить его на букву. например, наш файл кодов хафмена содержит коды: а - 11001 б - 11011 1) рассматриваем, например, первых два байта из архивированного файла. допустим первые два байта нашего заархивированного файла такие: 11001110|1111001| 2) сравниваем каждый код из файла кодов файла побитово(смотрим, есть ли такой код в таблице)- сравниваем c 1-битом 1-го байта из файла. совпадает. 2-ой-совпадает. 3-ий совпадает. 4-ый. ..упс. облом. - не совпадает! тогда переходим к след. коду и начинаем заново сравнивать с 1-ым битом 1-го байта: 1-ый-совпадает. 2-ой-совпадает... как видно все совпали- смотрим, что это буква б. т.е. расшифровали: б110|11110010| далее начиая с 6-го бита дальше в таком же духе продолжаем, сравнивая 3 бита из первого байта и если совпало, переходим далее к сравнению битов второго байта. При запуске вводить следующее: 1(CODER): имя файла, который надо закодировать(text32.txt)-прилагается в архиве файл, в который записываются коды(допустим hhh.arh) имя файла с таблицей кодов хафмена(txt32.haf)-прилагается в архиве 2(DECODER): имя закодированного файла(hhh.arh) имя файла, в который запишем "раскодирование "(пусть будет text!!!.txt) имя файла с таблицей кодов хафмена(txt32.haf)-прилагается в архиве Присоединённый файл ( Кол-во скачиваний: 0 )
Archive.rar 7,59 Kb |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Это исключение означает ровно то, что написано: обращение к невыделенной памяти. Скорее всего, у тебя проблемы с адресацией массива, т.е. индекс неправильный.
-------------------- ... |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 1 Всего: 45 |
Однозначно. Смотрим:
В цикле нет проверки на i < 256, и если c не найдено, то i может стать большим или равным 256, что как раз и означает выход за пределы массива. Что будет, если символ не найден в таблице? Или предполагается, что такого быть не может? Почему c не найден - другой вопрос. Может, его в таблице нет, может, таблица неправильно считывается. Смотрим: Та же ситуация: нет проверки индекса i на значение 256. Нет и гарантии, что охвачены все 256 ASCII и расширенных символов. Считанную таблицу нужно распечатать и проверить... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 1 Всего: 39 |
Выход за пределы массива
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Асоишница |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 13.3.2012 Репутация: нет Всего: нет |
Всем спасибо. Действительно прошляпила проверку на выход за пределы массива. Правда некорректно работает
в полученном разархивированном файле в .txt начало каждой строки не то(( а .bmp вообще не открывается- ошибка Зато с .doc , .docx , .jpg и даже с .rar всё отлично. В чём тут дело..... Это сообщение отредактировал(а) Асоишница - 14.3.2013, 17:20 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 1 Всего: 45 |
Ну, не знаю. Все вычисления - целочисленные, зачем такое писать:
Вот зачем здесь арифметика с плавающей точкой??? 2 в степени k есть (1 << k), то есть побитовый сдвиг единички на k позиций влево. К сожалению, очень трудно разбирать Ваш код. И очень не нравится строковое побитовое представление, чем unsigned int не угодил? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Асоишница |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 13.3.2012 Репутация: нет Всего: нет |
feodorv, 2 с точкой- это чтоб компилятор не ругался на перегруженность функции.
А как с побитовым сдвигом это сделать? Добавлено через 5 минут и 9 секунд ошибку нашла- она была в обрабатываемом файле с кодами. вернее она была в предыдущей лабе, а я её не сразу заметила- код исправила, а файлы не переделала. |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 1 Всего: 45 |
Ну так тут что 2 с точкой, что без точки. pow всё равно рассматривает аргумент как число с плавающей точкой. И всё равно возвращает double.
Мои поздравления -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Асоишница |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 13.3.2012 Репутация: нет Всего: нет |
feodorv, спасибо)всё работает)
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |