Форум: "Начинающим";
Текущий архив: 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