Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.003 c
15-1328346033
Smile
2012-02-04 13:00
2012.06.03
Субботняя задачка :)


2-1327586737
dubdaze
2012-01-26 18:05
2012.06.03
определение MDI-окна, обратившегося к форме


15-1327516969
Псарь
2012-01-25 22:42
2012.06.03
Как вы следите за обновлениями?


15-1328291750
Dimka Maslov
2012-02-03 21:55
2012.06.03
Про синхронизацию


2-1327592362
whoim
2012-01-26 19:39
2012.06.03
Ищу подходящий компонент: матрица, квадраты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский