Разбираю алгоритмы обнаружения ошибок, в том числе Код Хэминга, но на Паскале не могу написать программу. Поделитесь мыслями...
Atos
18.10.2005 15:49
NePolina, зачем же спрашивать в чужой теме? Создай свою. И напиши подробнее, в чём именно возникают проблемы при составлении программы.
volvo
28.10.2005 18:52
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);
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);
При старте программы вводится последовательность бит, которые должны быть переданы. Программа кодирует их по Хэммингу, и выводит результат - последовательность бит, готовую к передаче (при этом красным цветом выделены "избыточные" биты, не несущие информации, а используемые только для отслеживания ошибки).
Затем вводится строка битов, полученная приемником информации, и после ее анализа выводится результат - есть ли ошибка, и в какой именно бите... (биты нумеруются СЛЕВА НАПРАВО (!!!) начиная с единицы). Идея программы взята отсюда: Код Хэмминга
Вот лог работы программы:
Цитата
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
-NePolina-
29.10.2005 21:16
Спасибо, вот именно это мне надо было!!! Просто не могу правильно выражать свои мысли. Еще раз ОГРОМНОЕ СПАСИБО!!!!!
Pograp
15.11.2006 0:02
программа работает немножко не корректно! введите 1001 в sent data и 1 0 0 1 1 208 208 1 208 0 0 в checking error ответ -1 я код Хеминга ещё так не проходил но писать как самого "умного" заставили объясните тупому
volvo
15.11.2006 0:14
Pograp, чтобы программа выдавала корректный результат, надо следовать инструкциям... Тебе белым по черному написано:
Цитата
sent data [7] bits:
, следовательно sent data должно состоять из 7 бит, а ты привел 4...
Идем дальше: что такое бит знаешь? 0 или 1... Так по какому праву в
Цитата
received data [11] bits:
ты вводишь этот бред? вводи одиннадцать символов 0/1... Что ты хочешь, чтоб программа выдала?
Dignity
20.01.2009 4:33
Цитата(volvo @ 28.10.2005 14:52)
Вот лог работы программы:
Почему там избыточные" биты стоят на позициях 4, 8, 10, 11??? Должны же наоборот!!! 1,2,4,8.....
volvo
20.01.2009 4:59
Dignity То, что ты нумеруешь ВСЕ биты слева направо - это сугубо твоя проблема. То, что написано крупным шрифтом касается не исходных 7-ми бит, а 11-ти бит результата (received data). А выделенные красным биты нумеруются справа налево, и как раз-таки и будут на позициях, соответствующих степеням двойки (посмотри внимательно код, и ты увидишь это. Или я по-твоему просто так ввел функцию is_power, возвращающую истину, когда аргумент - степень двойки?)