Массив логических значений в число
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Массив логических значений в число
Допустим, есть 32 настройки вида "флажок" (0/1). Все их можно хранить в переменной вида DIM(32). И одновременно это же можно хранить в одной лишь переменной вида LONG. Какое будет самое красивое решение конвертации туда-сюда? Что-то у меня в голове только не очень красивые решения получаются (может потому что понедельник)
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Массив логических значений в число
При объемах памяти в гигабайтах, немного смешно уже побитно хранить ключики. 
Ну а вообще, как удобней так и храни.

Ну а вообще, как удобней так и храни.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Массив логических значений в число
Со строкой-то понятно, а дальше? Получим что-то типа '100010001000100100101'. Как из этого сделать long? Через band? Это как раз из серии не очень красивых решений. Может как-то через OVER получится красивее?
Мне не для памяти, а для ускорения чтения-записи настроек в файл/базу. Чтение 1 ячейки будет явно быстрее чтение 32 ячеек. Быстрее читаются настройки -> быстрее запускается программа -> более радостные пользователи
Мне не для памяти, а для ускорения чтения-записи настроек в файл/базу. Чтение 1 ячейки будет явно быстрее чтение 32 ячеек. Быстрее читаются настройки -> быстрее запускается программа -> более радостные пользователи
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Массив логических значений в число
Код: Выделить всё
megaconfig[1] = 1
megaconfig[2] = 0
! save field megaconfig
...
!read field megaconfig
message(megaconfig[1])
message(megaconfig[2])
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- ✯ Ветеран ✯
- Сообщения: 1038
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Массив логических значений в число
RaFaeL писал(а):Со строкой-то понятно, а дальше? Получим что-то типа '100010001000100100101'. Как из этого сделать long? Через band? Это как раз из серии не очень красивых решений. Может как-то через OVER получится красивее?
Мне не для памяти, а для ускорения чтения-записи настроек в файл/базу. Чтение 1 ячейки будет явно быстрее чтение 32 ячеек. Быстрее читаются настройки -> быстрее запускается программа -> более радостные пользователи

:=:
-
- ✯ Ветеран ✯
- Сообщения: 5158
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Массив логических значений в число
Есть функция BXOR, если что, для побитовых операций. Вот только неудобно это всё. Особенно, если речь идёт о SQL. Oracle вообще, по-моему, хранит числа в огромных ячейках.
We are hard at work… for you. 

Массив логических значений в число
Это верное заявление только в теории. На самом деле чтение памяти с дисков происходит блоками. В MS SQL, например, одновременно считывается 8K данных. И если ваша выборка из 32 байт будет считана за одно чтение головки диска, то остальным можно пренебречь, и делать так, как удобно программисту.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Массив логических значений в число
Да понятно, что string(32) от long по быстродействию вряд ли будет заметно отличаться. Просто мне кажется, как это это неаккуратно - хранить число (а битовая последовательность суть число) в строке. Вон, виндовый калькулятор и то влёт переводит из двоичной в десятичную, а кларион не может чтоль?
Что касается быстродействия вообще. Вот такой пример - приложение хранит ini в каталоге с базой, база на сервере. При работе имеем N putini в сетевой файл. На каждый putini файл меняется отдельно. На каждую запись в файл антивирус сканирует файл. Чтобы антивирусу (локальному) проверить файл, он его в фоне по сети себе перекачивает. В итоге на простейшее закрытие формы имеем "тормоза". Не, понятно что можно настроить файлы и каталоги как исключения, но вот по умолчанию оно работает именно так. И что получается - "у нас ваша программа тормозит", и ведь реально тормозит, если файл под сотню килобайт (а в большом проекте и окон и настроек много). И казалось бы такая фигня как замена N настроек на N/32 настроек может эту проблему вообще снять или сделать не значимой. А так то да, байты в гигабайтах
Что касается быстродействия вообще. Вот такой пример - приложение хранит ini в каталоге с базой, база на сервере. При работе имеем N putini в сетевой файл. На каждый putini файл меняется отдельно. На каждую запись в файл антивирус сканирует файл. Чтобы антивирусу (локальному) проверить файл, он его в фоне по сети себе перекачивает. В итоге на простейшее закрытие формы имеем "тормоза". Не, понятно что можно настроить файлы и каталоги как исключения, но вот по умолчанию оно работает именно так. И что получается - "у нас ваша программа тормозит", и ведь реально тормозит, если файл под сотню килобайт (а в большом проекте и окон и настроек много). И казалось бы такая фигня как замена N настроек на N/32 настроек может эту проблему вообще снять или сделать не значимой. А так то да, байты в гигабайтах
-
- ✯ Ветеран ✯
- Сообщения: 1038
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Массив логических значений в число
хз..., может пора посмотреть на "это" под другим углом и менять методу?RaFaeL писал(а):Да понятно, что string(32) от long по быстродействию вряд ли будет заметно отличаться. Просто мне кажется, как это это неаккуратно - хранить число (а битовая последовательность суть число) в строке. Вон, виндовый калькулятор и то влёт переводит из двоичной в десятичную, а кларион не может чтоль?
Что касается быстродействия вообще. Вот такой пример - приложение хранит ini в каталоге с базой, база на сервере. При работе имеем N putini в сетевой файл. На каждый putini файл меняется отдельно. На каждую запись в файл антивирус сканирует файл. Чтобы антивирусу (локальному) проверить файл, он его в фоне по сети себе перекачивает. В итоге на простейшее закрытие формы имеем "тормоза". Не, понятно что можно настроить файлы и каталоги как исключения, но вот по умолчанию оно работает именно так. И что получается - "у нас ваша программа тормозит", и ведь реально тормозит, если файл под сотню килобайт (а в большом проекте и окон и настроек много). И казалось бы такая фигня как замена N настроек на N/32 настроек может эту проблему вообще снять или сделать не значимой. А так то да, байты в гигабайтах
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Массив логических значений в число
long это же 4 байта? А не 32
Последний раз редактировалось RaFaeL 28 Декабрь 2015, 18:47, всего редактировалось 1 раз.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1411
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Массив логических значений в число
INIClass разве что переписать под работу с БД. Кстати, никто не делал?
Последний раз редактировалось RaFaeL 28 Декабрь 2015, 18:50, всего редактировалось 1 раз.
- Дед Пахом
- Старичок
- Сообщения: 3285
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 48 раз
- Контактная информация:
- Дед Пахом
- Старичок
- Сообщения: 3285
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 48 раз
- Контактная информация:
Массив логических значений в число
Во чего сваял:
Код: Выделить всё
PROGRAM
Flags ITEMIZE(1)
eq:Val1 EQUATE ! 1
eq:Val2 EQUATE ! 2
eq:Val3 EQUATE ! 3
eq:Val4 EQUATE ! 4
eq:Last EQUATE(32)
END
FlagsMgr CLASS, TYPE
v LONG, PRIVATE !value, 32 bits
Value PROCEDURE(LONG pValue)
Value PROCEDURE(), LONG
SetBit PROCEDURE(BYTE bitnumber)
ClearBit PROCEDURE(BYTE bitnumber)
GetBit PROCEDURE(BYTE bitnumber), BYTE
ToString PROCEDURE(), STRING
END
MAP
END
fmgr FlagsMgr
CODE
fmgr.Value(170)
MESSAGE(fmgr.ToString())
fmgr.SetBit(eq:Val3)
MESSAGE(fmgr.ToString())
fmgr.ClearBit(eq:Val2)
MESSAGE(fmgr.ToString())
MESSAGE('4th bit = '& fmgr.GetBit(eq:Val4))
FlagsMgr.Value PROCEDURE(LONG pValue)
CODE
SELF.v = pValue
FlagsMgr.Value PROCEDURE()
CODE
RETURN SELF.v
FlagsMgr.SetBit PROCEDURE(BYTE bitnumber)
bits LONG, AUTO
CODE
bits = BSHIFT(1, bitnumber - 1)
SELF.v = BOR(SELF.v, bits)
FlagsMgr.ClearBit PROCEDURE(BYTE bitnumber)
bits LONG, AUTO
CODE
bits = BSHIFT(1, bitnumber - 1)
bits = -(bits + 1) !bitwise NOT
SELF.v = BAND(SELF.v, bits)
FlagsMgr.GetBit PROCEDURE(BYTE bitnumber)
bits LONG, AUTO
CODE
bits = BSHIFT(1, bitnumber - 1)
RETURN CHOOSE(BAND(SELF.v, bits) <> 0)
FlagsMgr.ToString PROCEDURE()
bits LONG, AUTO
bitnumber BYTE, AUTO
sbits STRING(32)
CODE
LOOP bitnumber = 1 TO 32
bits = BSHIFT(1, bitnumber - 1)
sbits[32 - bitnumber + 1] = CHOOSE(BAND(SELF.v, bits) <> 0, '1', '0')
END
RETURN sbits
С уважением, ДП