IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Код Хэмминга, Алгоритмы обнаружения ошибок
сообщение
Сообщение #1


Гость






Разбираю алгоритмы обнаружения ошибок, в том числе Код Хэминга, но на Паскале не могу написать программу. Поделитесь мыслями...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


NePolina, зачем же спрашивать в чужой теме? Создай свою. И напиши подробнее, в чём именно возникают проблемы при составлении программы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






To: NePolina
Поскольку ответа, что именно нужно реализовать, не последовало, я пока приведу программку, наглядно показывающую работу кода Хэмминга:
uses crt;

const
data_len = 7;

type
PTBlock = ^TBlock;
TBlock = array[1 .. maxint] of byte;

function is_power(x: byte): boolean;
var bits: byte;
begin
bits := 0;
while x > 0 do begin

if (x and $01) = $01 then inc(bits);
x := x shr 1;

end;
is_power := (bits = 1);
end;

procedure print_block(X: PTBlock; const n: byte);
var i: byte;
begin
for i := n downto 1 do begin
if is_power(i) then textcolor(lightred)
else textcolor(lightgray);

write(X^[i]:4);
end;
writeln;
textcolor(lightgray);
end;

var
ctrl_bits: byte;
block: PTBlock;

s: string;
check, i, pos: byte;

begin
ctrl_bits := 0;
repeat
inc(ctrl_bits);
until (data_len + ctrl_bits + 1) <= (1 shl ctrl_bits);

writeln('p = ', ctrl_bits);

GetMem(block, (data_len + ctrl_bits)*sizeof(byte));
FillChar(block^, (data_len + ctrl_bits)*sizeof(byte), 0);
Write('sent data [', data_len, '] bits: '); ReadLn(s);

pos := 1;
for i := 1 to data_len do begin
while is_power(pos) do inc(pos);
block^[pos] := (ord(s[data_len - i + 1]) - ord('0')); inc(pos);
end;

check := $00;
for i := 1 to (data_len + ctrl_bits) do
if block^[i] = 1 then check := check xor i;

i := 1;
while check > 0 do begin
block^[i] := (check and $01);
check := check shr 1;
i := 2 * i
end;
print_block(block, (data_len + ctrl_bits));

{ Проверка правильности }
check := $00;
for i := 1 to (data_len + ctrl_bits) do
if block^[i] = 1 then check := check xor i;
writeln('checking error status [0 = no error]: ', check);

writeln;
Write('received data [', data_len + ctrl_bits, '] bits: '); ReadLn(s);
check := $00;
for i := 1 to (data_len + ctrl_bits) do
if s[(data_len + ctrl_bits) - i + 1] = '1' then check := check xor i;
writeln('checking error status [0 = no error]: ',
(data_len + ctrl_bits) - check + 1);

FreeMem(block, (data_len + ctrl_bits)*sizeof(byte));
ReadLn;
end.

При старте программы вводится последовательность бит, которые должны быть переданы. Программа кодирует их по Хэммингу, и выводит результат - последовательность бит, готовую к передаче (при этом красным цветом выделены "избыточные" биты, не несущие информации, а используемые только для отслеживания ошибки).

Затем вводится строка битов, полученная приемником информации, и после ее анализа выводится результат - есть ли ошибка, и в какой именно бите... (биты нумеруются СЛЕВА НАПРАВО (!!!) начиная с единицы).
Идея программы взята отсюда: Код Хэмминга

Вот лог работы программы:
Цитата
sent data [7] bits: 1110011
  1  1  1  1  0  0  1  1  1  1  0
checking error status [0 = no error]: 0

received data [11] bits: 11111011110
checking error status [0 = no error]: 5
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Спасибо, вот именно это мне надо было!!!
Просто не могу правильно выражать свои мысли.
Еще раз ОГРОМНОЕ СПАСИБО!!!!!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 1
Пол: Мужской
Реальное имя: Святослав

Репутация: -  0  +


программа работает немножко не корректно! введите 1001 в sent data и 1 0 0 1 1 208 208 1 208 0 0
в checking error ответ -1 я код Хеминга ещё так не проходил но писать как самого "умного" заставили
объясните тупому wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Pograp, чтобы программа выдавала корректный результат, надо следовать инструкциям... Тебе белым по черному написано:
Цитата
sent data [7] bits:
, следовательно sent data должно состоять из 7 бит, а ты привел 4...

Идем дальше: что такое бит знаешь? 0 или 1... Так по какому праву в
Цитата
received data [11] bits:
ты вводишь этот бред? вводи одиннадцать символов 0/1... Что ты хочешь, чтоб программа выдала?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата(volvo @ 28.10.2005 14:52) *

Вот лог работы программы:


Почему там избыточные" биты стоят на позициях 4, 8, 10, 11??? Должны же наоборот!!! 1,2,4,8.....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Dignity
То, что ты нумеруешь ВСЕ биты слева направо - это сугубо твоя проблема. То, что написано крупным шрифтом касается не исходных 7-ми бит, а 11-ти бит результата (received data). А выделенные красным биты нумеруются справа налево, и как раз-таки и будут на позициях, соответствующих степеням двойки (посмотри внимательно код, и ты увидишь это. Или я по-твоему просто так ввел функцию is_power, возвращающую истину, когда аргумент - степень двойки?)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






А для чего этот код в начале?

repeat
inc(ctrl_bits);
until (data_len + ctrl_bits + 1) <= (1 shl ctrl_bits);

writeln('p = ', ctrl_bits);

немогу въехать.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
А для чего этот код в начале?
Для того, чтобы вычислить число контрольных бит исходя из заданного числа бит-данных.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 9:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name