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

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

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

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


Гость






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


Гость






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
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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