Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Проблема с битовыми строками. / 7 сообщений из 7, страница 1 из 1
26.11.2012, 22:40
    #38054019
SergeyMi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с битовыми строками.
Коллеги, доброго дня.

Вот проблемма у нас с битовыми строками.
Помогите, кто может уже наступал на эти грабли.

Есть массив битовых строк. Он реальный и выдран из живой бд.
С этим массивом делаем битовые операции.
И происходит ошибка <INVALID BIT STRING>getAND+4^Sample.
Что характерно, если уменьшить длину битовой строки, то ошибка не происходит.

Вот рутина воспроизводящая ошибку. Она есть и в архиве. В архиве и проблемный массив.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
test
 s gl="^ZZ"
 s len=200000
 ;s len=196608  ;эта длина битовой строки ошибки не даёт
 w !,"в глобале битовые строки " 
 s i=gl f  s i=$q(@i) q:i=""  w !,i w $bitcount(@i,1),"+",$bitcount(@i,0),"=",($bitcount(@i,1)+$bitcount(@i,0))
 n res m res=@gl
 n res1 m res1=@gl
 ;размёржим его в две локали
 n tmp
 d getAND(.res,.res1,.tmp) w !,"Применим логическую ""&"" - ошибки нет"
 k tmp 
 s $bit(tmp(1),1)=0 ;инициализируем битовую строку
 w !,"Применим логическую ""или"" "
 d getOR(.res1,.tmp,.tmp)
  w !,"А потом снова ""&"" - получается ошибка, Выходит что операция OR ломает битовую стоку! Почему?"
 d getAND(.res,.tmp,.tmp)
 ;Другие битовые строки такой ошибки не давали.
 ;Проверяли на Cache for Windows (x86-32) 2012.1.2 (Build 702U)
 ;Cache for Windows (x86-32) 2012.2.0
 ;Cache for Windows (x86-32) 2012.2.1
 ;Cache for Windows (x86-32) 2011.
 ;Пробовали разные collation
 q
 
getAND(a,b,res)
 new block,count
 i $o(a(""),-1)>$o(b(""),-1) s count=$o(a(""),-1) ;вычислим мах кол-во блоков
 e  s count=$o(b(""),-1)
 f block=0:1:count s res(block)=$bitlogic(a(block)&b(block),len)
 q
  
getOR(a,b,res)
 new block,count
 i $o(a(""),-1)>$o(b(""),-1) s count=$o(a(""),-1) ;вычислим мах кол-во блоков
 e  s count=$o(b(""),-1)
 f block=0:1:count s res(block)=$bitlogic(a(block)|b(block),len)
 q
...
Рейтинг: 0 / 0
27.11.2012, 00:10
    #38054075
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с битовыми строками.
больше всего мне в вашем примере не понравилось использование длины в логических операторах
зачем вы умышленно увеличиваете количество элементов в битовом массиве
длина битовых строк во операциях желательно должны быть одинакова
в последнем элементе массива битов может быть меньше

в вашем случае если вам понадобится сделать операцию Not, то у вас появятся не существующие элементы в массиве, которые выйдут за пределы существующих значений

в общем ваша задача решается если, битов в операндах будет одно, либо вы откажитесь от указания длины
...
Рейтинг: 0 / 0
27.11.2012, 00:17
    #38054085
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с битовыми строками.
SergeyMiВот проблемма у нас с битовыми строками.
Помогите, кто может уже наступал на эти грабли.
Код: javascript
1.
2.
3.
4.
test
 s gl="^ZZ"
 s len=200000
 ;s len=196608  ;эта длина битовой строки ошибки не даёт


Наступал. Пока проблема решается только ограничением числа бит в битовой строке 64000. Значения 196608 и другие больше чем 64000 это частные случаи, о причинах и более детально может ответить WRC.
...
Рейтинг: 0 / 0
27.11.2012, 07:02
    #38054198
SergeyMi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с битовыми строками.
ну яНаступал. Пока проблема решается только ограничением числа бит в битовой строке 64000. Значения 196608 и другие больше чем 64000 это частные случаи, о причинах и более детально может ответить WRC.

Спасибо, будем обращаться в WRC.
...
Рейтинг: 0 / 0
27.11.2012, 10:19
    #38054316
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с битовыми строками.
ну яПока проблема решается только ограничением числа бит в битовой строке 64000
Ага, и битмап индексы хранятся как битовые строки по 64000.
...
Рейтинг: 0 / 0
28.11.2012, 16:51
    #38056677
SergeyMi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с битовыми строками.
Всем спасибо за участие. Проблему решили уменьшением битовой строки до 64000.
...
Рейтинг: 0 / 0
17.12.2012, 14:13
    #38081904
Дмитрий64
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с битовыми строками.
SergeyMi,
неужто с 2003 года не все баги с битовыми строками >64000 бит вычищены? Мне тогда ещё Николай Жохов этот workaround посоветовал.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Проблема с битовыми строками. / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]