Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.06.03;
Скачать: CL | DM;

Вниз

Побитно..   Найти похожие ветки 

 
whoim ©   (2012-01-27 02:06) [0]

тема растет отсюда: http://delphimaster.net/view/2-1327592362/
Есть двумерный массив data, тип boolean. Разрядность обоих измерений кратна 8 (16,48). Нужно пробежаться циклами по обоим его измерениям и составить из значений true и false, байты (значения массива ассоциируются с битами). Но что то не работают мои изыски.. помогите найти ошибку?


var
 _byte: Byte; //буфер для сложения данных
 j,k,_counter: integer; //переменные для доступа к массиву
-----------
 _counter := 0; //инициализация счетчика
 //TRBuf := PChar(""); //инициализация буфера порта
 for j:=1 to 16 do //цикл по строкам
   for k:=1 to 48 do //цикл по столбцам
     begin
     if data[j,k] //если элемент массива "включен"
       then _byte := _byte or (1 shl 1) //побитово добавляем единицу
       else _byte := _byte or (0 shl 1); //иначе добавляем ноль
     inc(_counter); //увеличиваем счетчик битов
     if _counter > 7 then //если счетчик переполнен
       begin
       Memo1.Lines.Add(IntToStr(j)+"/"+IntToStr(k)+"="+Chr(_byte)); //тут вывод результата
       _byte := _byte shr 8; //очищаем буфер
       _counter := 0;  //очищаем счетчик
       end;
     end;


 
whoim ©   (2012-01-27 02:11) [1]

у меня всегда так.. не нахожу ответа пока не запощу вопрос)))
вот так работает (гугл дорылся таки)
     if data[j,k]
       then _byte := _byte or (1 shl _counter)
       else _byte := _byte and (0 shl 1 XOR $FF);


 
Германн ©   (2012-01-27 02:26) [2]


> whoim ©   (27.01.12 02:11) [1]
>
> у меня всегда так.. не нахожу ответа пока не запощу вопрос)))
> вот так работает (гугл дорылся таки)

А потом Фобос-Грунт падает. :(
(с) Jeer


 
Sha ©   (2012-01-27 05:45) [3]

> whoim ©   (27.01.12 02:11) [1]

все равно первый байт вычислен неверно


 
han_malign   (2012-01-27 08:33) [4]


> byte := _byte and (0 shl 1 XOR $FF)

- ты это... - такую траву больше не кури...

_byte and not (1 shl _counter);


 
han_malign   (2012-01-27 08:45) [5]

0 shl 1 = 0
0 хоr $FF = $FF
_byte and $FF = _byte

итого все выражение вырождается до
_byte:= byte;
что в общем терпимо, только перед циклом надо _byte очистить...

а по нормальному:
_byte:= _byte shr 1;
if data[j,k] then _byte := _byte or $80;
inc(_counter);
if( _counter and $7 = 0 )then begin
  Memo1.Lines.Add("char["IntToStr(_counter shr 3 +1)+"]="""+Chr(_byte)+"""");
end;

и очистку _byte - делать не надо...


 
han_malign   (2012-01-27 08:57) [6]

_counter кстати тоже лишний, заполнение октета можно по k отслеживать...


 
Dimka Maslov ©   (2012-01-27 09:43) [7]


> А потом Фобос-Грунт падает. :(


Он упал от плазменного новообразования в верхних слоях атмосферы.

Автору же стоит напомнить о том, что биты в байте записываются от младшего к старшему, а в строке от старшего к младшему. Это тоже надо учитывать.


 
Anatoly Podgoretsky ©   (2012-01-27 10:00) [8]


> //очищаем буфер

Почему это делаем сдвигами.
Да и вообще код вызывает сильно сопротивление


 
icWasya ©   (2012-01-27 10:15) [9]

А если немножко переставить
 _byte := _byte shl 1;
 if data[j,k] //если элемент массива "включен"
 then _byte := _byte or 1 //побитово добавляем единицу
 else _byte := _byte or 0; //иначе добавляем ноль


 
whoim ©   (2012-01-27 10:42) [10]


> han_malign

Реально спасибо. Сняло проблему, от которой мозг уезжал (комментируем вызов отправки в компорт - работает правильно, отправляем в компорт перед выводов в лог - неправильно). Курил не я а гугл )

> а в строке от старшего к младшему

у меня побайтно отправляется, так что вроде все соблюдено

> Да и вообще код вызывает сильно сопротивление

Подскажите, как будет классически и более правильно?

> icWasya

Зачем? Байт обнуляется один раз за 8 циклов

> _counter кстати тоже лишний, заполнение октета можно по
> k отслеживать...

почти вьехал, буду думать при оптимизации. Пока - задача заставить заработать.

Прием через компорт молчит..


 
Inovet ©   (2012-01-27 10:52) [11]

> [9] icWasya ©   (27.01.12 10:15)
> else _byte := _byte or 0; //иначе добавляем ноль

_byte and $fe


 
Inovet ©   (2012-01-27 10:54) [12]

> [10] whoim ©   (27.01.12 10:42)
> > а в строке от старшего к младшему
>
> у меня побайтно отправляется, так что вроде все соблюдено

У тебя индекс в массиве с положительным приращением, а байт ты двигаешь влево. Младшие значения массива оказываются в старших битах байта.


 
whoim ©   (2012-01-27 11:42) [13]

Значит, я ту же ошибку делаю и на стороне приема информации, ибо работает )
Работает - не трожь :)))

Биты тут нужны для переброски в такой же массив (булеан) на стороне микроконтроллера, так что пох.. Динамическая индикация, "картинка" на светодиодах. 1 вкл, 0 выкл.


 
Anatoly Podgoretsky ©   (2012-01-27 11:47) [14]

> Inovet  (27.01.2012 10:54:12)  [12]

Ты лучше назови что хорошо, может быть найдешь


 
Плохиш ©   (2012-01-27 11:58) [15]


>        else _byte := _byte or (0 shl 1); //иначе добавляем ноль

Враньё

>        else _byte := _byte and (0 shl 1 XOR $FF);

Дерьмокод. _byte не изменяется.

>  else _byte := _byte or 0; //иначе добавляем ноль

И здесь враньё

PS. Я так понимаю, булеву логику в институтах больше не преподают.


 
Inovet ©   (2012-01-27 11:59) [16]

> [14] Anatoly Podgoretsky ©   (27.01.12 11:47)
> Ты лучше назови что хорошо, может быть найдешь

Не нашёл. но можно поправить, воспользовавшись советами, было бы желание.


 
whoim ©   (2012-01-27 12:07) [17]

Ребята, все поправил! Огромное спасибо!
Более того - понял как работает. Все таки с МК вожусь, хоть и на начальном уровне. Другое дело что забуду через сутки если такая же задача не встанет - жизнь такая у меня, места в голове нет уже..
>И здесь враньё
угу, и это люди советовали в статьях. Ну либо я не так применил..
PS. Я так понимаю, булеву логику в институтах больше не преподают.
Не дошел я до логики, цена за обучение выросла с 7 до 60 тысяч. Не потянул.


 
Dimka Maslov ©   (2012-01-27 12:36) [18]


> у меня побайтно отправляется, так что вроде все соблюдено


Отправляется то побайтно, но биты в байты добавляются не с той стороны


 
Anatoly Podgoretsky ©   (2012-01-27 13:27) [19]

> Плохиш  (27.01.2012 11:58:15)  [15]

Только в университетах, на отдельных курсах


 
Anatoly Podgoretsky ©   (2012-01-27 13:28) [20]

> Inovet  (27.01.2012 11:59:16)  [16]

А где его взять?


 
Anatoly Podgoretsky ©   (2012-01-27 13:28) [21]

> whoim  (27.01.2012 12:07:17)  [17]

Зачем тогда в 91 году меняли политический строй?


 
Jeer ©   (2012-01-27 22:21) [22]


> Зачем тогда в 91 году меняли политический строй?


Ты лучше скажи - зачем классы ликвидировали, отменили с.к., конфискацию, ввели ЕГЭ, "убили" армию, развалили: военную медицину, прикладную науку, производства, военно-инженерные академии, зачем завалили народ даже не водкой, а пивом, зачем гастар.. тьфу их, пригласили, зачем маскарад словоблудия, на хера нам веб-камеры, даже две и кто будет долбить в вечно мерзлоте канаву для оптоволокна, если очередной Фобос-Выборы завалится по расписанию в самую глубокую впадину еще Мирового океана, и на кой ляд мужикам телки, у которых исчезли органы размножения, а им на фига  - аналогично. Ну открыло НАСА 11 дальних планет на горизонте видимости и шо ?

Туда лететь ?


 
Плохиш ©   (2012-01-28 13:38) [23]


> Jeer ©   (27.01.12 22:21) [22]

Скулить не надоело?


 
Dimka Maslov ©   (2012-01-28 16:59) [24]


>  Jeer ©   (27.01.12 22:21) [22]


Как я уже однократно говорил, с точки зрения научной эсхатологии, всё это не имеет никакого смысла. Энтропию не победить.


 
Jeer ©   (2012-01-28 22:04) [25]


> Плохиш ©   (28.01.12 13:38) [23]
>
>
> > Jeer ©   (27.01.12 22:21) [22]
>
> Скулить не надоело?


А ты, значит, "дровишки в собственном огороде колешь" и на тебе человечество заканчивается ? Да тебя вообще не заметят :)


 
Германн ©   (2012-01-29 01:29) [26]


> Плохиш ©   (28.01.12 13:38) [23]


> Jeer ©   (28.01.12 22:04) [25]

Давайте жить дружно.


 
Плохиш ©   (2012-01-29 03:44) [27]


> Jeer ©   (28.01.12 22:04) [25]

А, понятно, кухонный радетель за всея человечество.

> Германн ©   (29.01.12 01:29) [26]
> Давайте жить дружно.

Да без проблем, только форум с кухней путать не надо.



Страницы: 1 вся ветка

Текущий архив: 2012.06.03;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.01 c
15-1328469314
Artem
2012-02-05 23:15
2012.06.03
Как определить что в COM-порт пришли данные?


15-1328120761
upc
2012-02-01 22:26
2012.06.03
Форма, MainMenu, PopupMenu, глюк


15-1328246954
AV
2012-02-03 09:29
2012.06.03
Не работает Beep. Не всегда. Закономерности не вижу.


2-1327946153
Rorschach
2012-01-30 21:55
2012.06.03
Портирование С++ кода на Паскаль


2-1327950833
Max
2012-01-30 23:13
2012.06.03
Ошибки с Tstream