
12.11.2008, 00:29
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
С нами:
9273960
Репутация:
23
|
|
Доброго времени суток, появилась такая проблемка c алгоритмом Хаффмана:
Имеется массив содержащий набор двоичныч кодов ( пр. char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}}; ) для букв a, b, c. Как в файле поменять каждую a, b и c на ее двоичный код? Совсем чего-то запутался, ведь нет же переменных, которые хранят двоичный код? А с этим чаром что так 8 байт что так =(
|
|
|

12.11.2008, 00:34
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
С нами:
9885926
Репутация:
1188
|
|
Сообщение от Lee_fx
Доброго времени суток, появилась такая проблемка c алгоритмом Хаффмана:
Имеется массив содержащий набор двоичныч кодов ( пр. char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}}; ) для букв a, b, c. Как в файле поменять каждую a, b и c на ее двоичный код? Совсем чего-то запутался, ведь нет же переменных, которые хранят двоичный код? А с этим чаром что так 8 байт что так =(
если я тебя правильно понял то те нужно открыть файл и читать посимвольно. если встречается тот символ что нужен то заменить на код..
почему бы не использовать код из 3-х цифр как строку? а сделать поиск по файлу и использовать замену строк (типа как replacestr() )...
|
|
|
помогите найти где я втыканул в коде... |

12.11.2008, 00:28
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
С нами:
9885926
Репутация:
1188
|
|
помогите найти где я втыканул в коде...
есть функция RUN которая берет значение, полученное с листбокса диалога, передает его в подключаемую DLL библиотеку, которая должна приплюсовать к этому значению 3 и вернуть в RUN результат. Потом функция RUN выводит результат не экран.
вот что накодил...
Код:
void CMyFrameWin::OnRun()
{
/*
char s[80]; // проверка доходит ли Number до передачи в DLL
CClientDC dc(this); // проверка доходит ли Number до передачи в DLL
wsprintf(s,"Number is %d",Number); // проверка доходит ли Number до передачи в DLL
dc.TextOut(100,200,s); // проверка доходит ли Number до передачи в DLL
*/
int res;
HINSTANCE hDll;
char s[100];
hDll=::LoadLibrary("MyDll");
typedef int (*FUN)(int);
FUN func;
func=(FUN)::GetProcAddress(hDll, "calc");
res=(*func)(Number);
sprintf(s,"%f", res);
MessageBox(s,"Result");
//создание и запись результата в файл
FILE *result;
result=fopen("result.txt","w");
fprintf(result,"%f",res);
fclose(result);
}
значение Number в функцию RUN доходит нормально (проверка выводом на экран без использования DLL)
собственно сам код DLL библиотеки: MyDll
Код:
#include "stdafx.h"
#include <conio.h>
int calc(int Number)
{
int r=Number;
int res;
res=r+3;
return res;
}
и код файлика MyDll.def
Код:
LIBRARY "MyDll"
DESCRIPTION 'This library has one function'
EXPORTS
calc @1
независимо от того какое значение Number получает функция RUN от листбокса диалога (а получает постоянно точно то же что я выбрал в диалоге, я проверял без подключения DLL простым выводом) получаем постоянно в результате НОЛЬ...
я уже хз где я мог втыкануть.... может тому кто долго не втыкал этот бред на свежую голову все покажется просто и укажет на траблу..
Заранее спасибо за любой ответ.
|
|
|

12.11.2008, 01:05
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
С нами:
9679872
Репутация:
347
|
|
Сообщение от NetSter
независимо от того какое значение Number получает функция RUN от листбокса диалога (а получает постоянно точно то же что я выбрал в диалоге, я проверял без подключения DLL простым выводом) получаем постоянно в результате НОЛЬ...
...
я уже хз где я мог втыкануть.... может тому кто долго не втыкал этот бред на свежую голову все покажется просто и укажет на траблу..
Заранее спасибо за любой ответ.
ты там написал:
sprintf(s,"%f", res);
но res вообще-то целого типа. Попробуй
sprintf(s,"%d", res);
|
|
|

12.11.2008, 01:07
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
С нами:
9273960
Репутация:
23
|
|
Код:
FILE *MyFile, *OUT;
char temp;
Symbols[3] = {'a', 'b', 'c'};
......
MyFile = fopen("1.txt", "r");
OUT = fopen("2.txt", "wb");
while(!feof(MyFile))
{
fread(&temp, 1, sizeof(char), MyFile);
for(i=0; i<3; i++)
if(temp == Symbols[i])
fwrite((const char*)&a[i], 1, sizeof(a[i]), OUT);
}
Получается файл намного больше по размеру, немогу понять как функция fwrite пишет =(
|
|
|

12.11.2008, 13:16
|
|
Познающий
Регистрация: 21.09.2008
Сообщений: 42
С нами:
9282044
Репутация:
61
|
|
Сообщение от Lee_fx
Получается файл намного больше по размеру, немогу понять как функция fwrite пишет =(
Вы не понимаете саму суть битов. Бит - 1/8 часть байта, которая может быть либо 0 либо 1. Отдельный бит записать в файл нельзя. Записать его можно только в виде байта. Соответственно перед записью битов необходимо их паковать в байты, и при накоплении количества битов кратному 8ми, записывать их в выходной файл. Вот накатал небольшое решение для вашего вопроса:
Код:
#include <stdio.h>
void main()
{
FILE *in, *out;
//кодирование 3мя битами
int ar[3] = {0x00, 0x05, 0x07}; //коды 'a', 'b', 'c'
char buf; //тут сидит считанный байт с файла
in = fopen("f1.txt", "rb");
out = fopen("f2.bin", "wb");
int count = 0;
union {
int out_buf;
char b[4];
} data;
data.out_buf = 0;
while(fread(&buf, 1, 1, in))
{
if(count < 8)
{ //не записываем, пока не наберем кратное 8ми
//количество битов
data.out_buf = (data.out_buf<<3) + ar[buf - 'a'];
count++;
}
else
{ //запись битов
fwrite(&data.b[2], 1, 1, out);
fwrite(&data.b[1], 1, 1, out);
fwrite(&data.b[0], 1, 1, out);
data.out_buf = ar[buf - 'a'];
count = 1;
}
}
if(count > 0)
{ //запись остатков
fwrite(&data.b[2], 1, 1, out);
fwrite(&data.b[1], 1, 1, out);
fwrite(&data.b[0], 1, 1, out);
}
fclose(out);
fclose(in);
}
Вот пример файла для кодирования (f1.txt) 22 байта:
Код:
bacbabcabcbacbabcbacba
После ужатия получили 12 байт, но в конце есть лишние байты, т.к. количество битов не кратно 8ми (22*3 = 66), соответственно в начале файла нужно хранить ещё выходной размер файла, чтобы опустить лишнюю информацию в конце файла, но это уже за рамками поста (пиши в ПМ, если что).
Следует учитывать, что по Хаффману для каждого символа должен быть свой код, т.е. во входном файле все возможные символы должны быть предугаданы тобой, то бишь быть в массиве ar.
|
|
|

12.11.2008, 01:28
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
С нами:
9679872
Репутация:
347
|
|
код не весь. Если ты объявлял так:
char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}};
то переменная `a[i]` будет размером в 4 байта. Соответственно fwrite будет записывать немного больше чем ожидалось
Последний раз редактировалось bons; 12.11.2008 в 01:31..
|
|
|

12.11.2008, 08:55
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
С нами:
9273960
Репутация:
23
|
|
Сообщение от bons
код не весь. Если ты объявлял так:
char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}};
то переменная `a[i]` будет размером в 4 байта. Соответственно fwrite будет записывать немного больше чем ожидалось
На этот ляп ладно, можно [4][4] сделать, мня интересует как вместо символа размером 8 байт записать двоичный код размером 4?
|
|
|

12.11.2008, 11:11
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
С нами:
9679872
Репутация:
347
|
|
ага, я наконец врубился что ты хочешь.
кстати символ скорее 1 байт чем 8.
программа твоя ..гхм.. замечательна, но работать правильно она будет только если ты изменишь там пару строчек:
Код:
FILE *MyFile, *OUT;
char temp;
Symbols[3] = {'a', 'b', 'c'};
......
MyFile = fopen("1.txt", "r");
OUT = fopen("2.txt", "wb");
while((temp=fgetc(MyFile))!=EOF)
{
for(i=0; i<3; i++)
if(temp == Symbols[i])
fwrite((const char*)&a[i], 1, sizeof(a[i]), OUT);
}
|
|
|

12.11.2008, 23:36
|
|
студент
Регистрация: 30.07.2007
Сообщений: 800
С нами:
9885926
Репутация:
1188
|
|
кто шарит реализовать звучание звука в MFC приложении..
уже пару постов создавал но так и не получилось..
посоветуйте плиз кто что знает)
смотрите посты ЗДЕСЬ и ЗДЕСЬ
спасибо.
|
|
|
|
 |
|
|
Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
|
|
|
|