Алгоритм перебора кодов ошибок. Как лучше?

jenya7
Дата: 20.08.2018 08:40:15
Застрял казалось бы на ровном месте.

Есть четыре установки, в каждой 19 каналов, в каждом канале 64 бита - каждый бит - флаг номера ошибки то есть всего 64 ошибки.
То есть
typedef struct
{
    uint64_t channel_fail_codes[19];
}FAILURE_CODES;

FAILURE_CODES unit_failure_code[4];


И если пришло
unit_failure_code[3].channel_fail_codes[1] = 0x24; ..(0010 0100)
То значит в установке номер 3 в канале номер 1 есть два кода ошибки - №2 и №5

И все бы хорошо но мне нужно показать коды ошибок на дисплее в форме UNIT_NUM CHANNEL_NUM FAILURE_CODE

и кнопками вверх вниз перебирать коды ошибок.

допустим пришли данные
УСТАНОВКА 0 КАНАЛ 1 ОШИБКИ 2 И 5
УСТАНОВКА 0 КАНАЛ 2 ОШИБКИ 3 И 4
УСТАНОВКА 1 КАНАЛ 7 ОШИБКИ 1 И 6 и 7

на каждое нажатие на кнопку *вверх* я должен увидеть

UNIT CHAN CODE
00 01 02
00 01 05
00 02 03
00 02 04
01 07 01
01 07 06
01 07 07

Вопрос как сохранить коды ошибок? В какой структуре?

На каждый канал в каждой установке открыть 64 переменных - по количеству ошибок на канал?
Но тогда получается 4(установки) * 19(каналов) * 64(ошибки) = 4864 байт. Монструозный размерчик.

А если отображать динамически. Нужно перебрать в одной установке все каналы со всеми присутствующими кодами а потом перейти к следующей
установке и там повторить то же самое и так далее.
Dima T
Дата: 20.08.2018 08:53:44
jenya7
на каждое нажатие на кнопку *вверх* я должен увидеть

UNIT CHAN CODE
00 01 02
00 01 05
00 02 03
00 02 04
01 07 01
01 07 06
01 07 07

Храни в таком виде, всего 21 байт. Чем такой формат не нравится?
jenya7
Дата: 20.08.2018 08:58:36
Dima T
jenya7
на каждое нажатие на кнопку *вверх* я должен увидеть

UNIT CHAN CODE
00 01 02
00 01 05
00 02 03
00 02 04
01 07 01
01 07 06
01 07 07

Храни в таком виде, всего 21 байт. Чем такой формат не нравится?

это же переменная величина. а если придут все коды по всем каналам по всем четырем установкам?
АСУ ТПшник
Дата: 20.08.2018 09:07:37
Ну ты сам на свой вопрос и ответил - делай массив для каждой установки именно для такого случая. 4 массива по 64 бита. Коллега чтоли? :)
АСУ ТПшник
Дата: 20.08.2018 09:08:24
В смысле 4*19*64.
Dima T
Дата: 20.08.2018 09:09:47
jenya7
это же переменная величина. а если придут все коды по всем каналам по всем четырем установкам?

Если все, то 14,5 кб потребуется.
Насколько вероятна такая ситуация? Сколько ошибок обычно бывает?

Исходи из того что в исходном виде требуется 4864 бит или 608 байт. Все что меньше - приемлемо. Если обычно ошибок немного, то тот формат подходит.

Эту запись можно немного соптимизировать. Если всегда установок не более 8, а каналов не более 32, то их можно уместить в 1 байт, плюс байт под номер ошибки, т.е. 2 байта на хранение одной ошибки.
jenya7
Дата: 20.08.2018 09:10:13
АСУ ТПшник
Ну ты сам на свой вопрос и ответил - делай массив для каждой установки именно для такого случая. 4 массива по 64 бита. Коллега чтоли? :)

4(установки) * 19(каналов) * 64(ошибки) = 4864 байт. И если учесть что с кодом ошибки нужно хранить номер установки и номер канала - 9728 байт!!!
Akina
Дата: 20.08.2018 09:13:51
jenya7
Но тогда получается 4(установки) * 19(каналов) * 64(ошибки) = 4864 байт. Монструозный размерчик.
А цель-то какая?

Если цель в хранении и отображении - то приоритетом будет полнота хранения и эффективность доступа. А тогда 5 кбайт- это тьфу, и растереть...
Dima T
Дата: 20.08.2018 09:14:40
jenya7
4(установки) * 19(каналов) * 64(ошибки) = 4864 байт.

Почему байт? У тебя же 1 бит - 1 ошибка. 4864 бит - это 608 байт.
jenya7
И если учесть что с кодом ошибки нужно хранить номер установки и номер канала - 9728 байт!!!

Вроде как номер установки уже уже учли. Или еще есть какой-то другой номер о котором ты не упомянул?
jenya7
Дата: 20.08.2018 09:21:50
Dima T
jenya7
4(установки) * 19(каналов) * 64(ошибки) = 4864 байт.

Почему байт? У тебя же 1 бит - 1 ошибка. 4864 бит - это 608 байт.
jenya7
И если учесть что с кодом ошибки нужно хранить номер установки и номер канала - 9728 байт!!!

Вроде как номер установки уже уже учли. Или еще есть какой-то другой номер о котором ты не упомянул?


unit_failure_code[3].channel_fail_codes[1] = 0x00000024;

это значит нужно сохранить
unit=3 channel=1 code=2
unit=3 channel=1 code=5

каждый бит это номер ошибки