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

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

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

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


Гость






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


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

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

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


NePolina, зачем же спрашивать в чужой теме? Создай свою. И напиши подробнее, в чём именно возникают проблемы при составлении программы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.10.2005 14:52
Сообщение #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
 К началу страницы 
+ Ответить 
-NePolina-
сообщение 29.10.2005 17:16
Сообщение #4


Гость






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





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

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


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


Гость






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

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


Гость






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

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


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


Гость






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


Гость






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

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

writeln('p = ', ctrl_bits);

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


Гость






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

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

 



- Текстовая версия 18.07.2025 3:47
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"