Страница 2 из 2

Re: Метод LZO C++

Добавлено: 02 дек 2015, 16:35
Maray
Absurd писал(а):И что, у вас вся группа не может запустить консольную программу с тремя параметрами?

Я с таким просто ещё не встречалась.
У нас было, объявили переменную, присвоили значение.
А вот как вот здесь я не пойму
Зачем вообще переменная argc нужна

Код: Выделить всё

if (argc < 4) {
		printf("Usage: lzw [e|d] <input.txt> <output.bin> \n");
		return -1;
	}

Re: Метод LZO C++

Добавлено: 02 дек 2015, 16:40
Absurd
argc - количество параметров в командной строке, где сама программа считается первым параметром. Допустим, запускаете ее так: lzw.exe e file1.txt file1.bin. lzw.exe - аргумент 1, e - аргумент 2, file1.txt - аргумент 3, file1.bin - аргумент 4. Итого 4. Проверка для того чтобы проверить, заданы ли все необходимые параметры. Если не заданы, программа выводит сообщение об ошибке, пишет как ее запускать правильно и завершает свою работу. Если вы пытаетесь запустить программу из IDE вроде Visual C++, там надо будет в настройках отладки указать командную строку.

Re: Метод LZO C++

Добавлено: 02 дек 2015, 16:51
Maray
Absurd писал(а):argc - количество параметров в командной строке, где сама программа считается первым параметром. Допустим, запускаете ее так: lzw.exe e file1.txt file1.bin. lzw.exe - аргумент 1, e - аргумент 2, file1.txt - аргумент 3, file1.bin - аргумент 4. Итого 4. Проверка для того чтобы проверить, заданы ли все необходимые параметры. Если не заданы, программа выводит сообщение об ошибке, пишет как ее запускать правильно и завершает свою работу. Если вы пытаетесь запустить программу из IDE вроде Visual C++, там надо будет в настройках отладки указать командную строку.

Вроде немного поняла. Большое спасибо за помощь! И извините, если вопросы были глупыми

Re: Метод LZO C++

Добавлено: 02 дек 2015, 19:39
Absurd
Maray писал(а):Вроде немного поняла. Большое спасибо за помощь! И извините, если вопросы были глупыми
Да без проблем. Могу еще кинуть график как оно работает, вдруг позволит проскочить.

На это графике блоки - функции, зеленые стрелки - вызовы функций, синие стрелки - ветвления, черные стрелки - блоки кода, толстые зеленые стрелки - вызовы функций которые составляют наибольший вес во времени работы программы, толстые черные стрелки - циклы с наибольшим количеством итераций. Фиолетовые стрелочки - системные вызовы. К сожалению, программа скомпилирована и операторы С в кружочках нечитаемы.

Сгенерировал график для декомпрессии, могу еще для компрессии сгенерировать.

https://dl.dropboxusercontent.com/u/9584161/cost.png

Re: Метод LZO C++

Добавлено: 11 янв 2016, 11:03
Maray
[quote="Absurd"][/QUOTE]
Добрый день!

Извините, пожалуйста, за беспокойство, это снова я. Возник вопрос по программе. В файле записана фраза "qwertyqwerty". В результате кодирования, в переменной ctx->dict следующие данные:

В скобках пишу prev, first, next, ch. Пишу те строки, в которых есть записи

101 (4294967295, 258, 4294967295, 'e')
113 (4294967295, 256, 4294967295, 'q')
114 (4294967295, 259, 4294967295, 'r')
116 (4294967295, 260, 4294967295, 't')
119 (4294967295, 257, 4294967295, 'w')
121 (4294967295, 261, 4294967295, 'y')
(Это, я поняла алфавит нашего файла. Буквы q, w, e, r, t, y)

256 (113, 262, 4294967295, 'w')
257 (119, 4294967295, 4294967295, 'e')
258 (101, 263, 4294967295, 'r')
259 (114, 4294967295, 4294967295, 't')
260 (116, 4294967295, 4294967295, 'y')
261 (121, 4294967295, 4294967295, 'q')
262 (256, 4294967295, 4294967295, 'e')
263 (258, 4294967295, 4294967295, 't')

А вот как это всё складывается не пойму. Помогите, пожалуйста

Re: Метод LZO C++

Добавлено: 11 янв 2016, 13:35
Absurd
4294967295 (в шестнадцатеричной системе - 0xffffffff) это максимальное значение которое можно записать в переменную unsigned int. Я так понимаю, это NIL, пустая ссылка. Не-NIL значение это ссылка внутри списка. 113 это ANSI код буквы 'q'. Алгоритм видимо такой: когда он считывет q из файла, он считывает также следующий байт ('w') и проверяет так же есть ли в в словаре комбинация qw. Если есть (в самом начале нет), он идет дальше и проверяет qwe. Если нет (наш случай), он пишет в выходной файл код буквы q и содает код 256 для цепочки "qw". Коды для цепочек байт больше 255, коды для единичных байт лежат в диапазоне [0, 255] и соответствуют самим байтам. prev - предыдущий код в цепочке, first - первый код в цепочке. Зачем нужен next я особо не углублялся. Я работаю с этим кодом на уровне "Функция по адресу X самая тяжелая, цикл в диапазоне адресов Y-Z самый тугой".

Re: Метод LZO C++

Добавлено: 12 янв 2016, 12:16
Maray
Absurd писал(а):4294967295 (в шестнадцатеричной системе - 0xffffffff) это максимальное значение которое можно записать в переменную unsigned int. Я так понимаю, это NIL, пустая ссылка. Не-NIL значение это ссылка внутри списка. 113 это ANSI код буквы 'q'. Алгоритм видимо такой: когда он считывет q из файла, он считывает также следующий байт ('w') и проверяет так же есть ли в в словаре комбинация qw. Если есть (в самом начале нет), он идет дальше и проверяет qwe. Если нет (наш случай), он пишет в выходной файл код буквы q и содает код 256 для цепочки "qw". Коды для цепочек байт больше 255, коды для единичных байт лежат в диапазоне [0, 255] и соответствуют самим байтам. prev - предыдущий код в цепочке, first - первый код в цепочке. Зачем нужен next я особо не углублялся. Я работаю с этим кодом на уровне "Функция по адресу X самая тяжелая, цикл в диапазоне адресов Y-Z самый тугой".
Немного поняла, Большое Вам спасибо! И извините за беспокойство

Re: Метод LZO C++

Добавлено: 12 янв 2016, 12:48
Romeo
Maray, сорри за офтоп. У тебя уже 11 сообщений, поздравляю со званием coder. Теперь у тебя есть возможность выставить аватарку. Если конечно, это тебе интересно :)