powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм перебора кодов ошибок. Как лучше?
25 сообщений из 25, страница 1 из 1
Алгоритм перебора кодов ошибок. Как лучше?
    #39690170
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Застрял казалось бы на ровном месте.

Есть четыре установки, в каждой 19 каналов, в каждом канале 64 бита - каждый бит - флаг номера ошибки то есть всего 64 ошибки.
То есть
Код: plaintext
1.
2.
3.
4.
5.
6.
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 байт. Монструозный размерчик.

А если отображать динамически. Нужно перебрать в одной установке все каналы со всеми присутствующими кодами а потом перейти к следующей
установке и там повторить то же самое и так далее.
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690179
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 байт. Чем такой формат не нравится?
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690183
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7на каждое нажатие на кнопку *вверх* я должен увидеть

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 байт. Чем такой формат не нравится?
это же переменная величина. а если придут все коды по всем каналам по всем четырем установкам?
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690188
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты сам на свой вопрос и ответил - делай массив для каждой установки именно для такого случая. 4 массива по 64 бита. Коллега чтоли? :)
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690189
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле 4*19*64.
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690190
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7это же переменная величина. а если придут все коды по всем каналам по всем четырем установкам?
Если все, то 14,5 кб потребуется.
Насколько вероятна такая ситуация? Сколько ошибок обычно бывает?

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

Эту запись можно немного соптимизировать. Если всегда установок не более 8, а каналов не более 32, то их можно уместить в 1 байт, плюс байт под номер ошибки, т.е. 2 байта на хранение одной ошибки.
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690191
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АСУ ТПшникНу ты сам на свой вопрос и ответил - делай массив для каждой установки именно для такого случая. 4 массива по 64 бита. Коллега чтоли? :)
4(установки) * 19(каналов) * 64(ошибки) = 4864 байт. И если учесть что с кодом ошибки нужно хранить номер установки и номер канала - 9728 байт!!!
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690195
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Но тогда получается 4(установки) * 19(каналов) * 64(ошибки) = 4864 байт. Монструозный размерчик.А цель-то какая?

Если цель в хранении и отображении - то приоритетом будет полнота хранения и эффективность доступа. А тогда 5 кбайт- это тьфу, и растереть...
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690196
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7 4(установки) * 19(каналов) * 64(ошибки) = 4864 байт.
Почему байт? У тебя же 1 бит - 1 ошибка. 4864 бит - это 608 байт.
jenya7И если учесть что с кодом ошибки нужно хранить номер установки и номер канала - 9728 байт!!!
Вроде как номер установки уже уже учли. Или еще есть какой-то другой номер о котором ты не упомянул?
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690200
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7 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

каждый бит это номер ошибки
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690202
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имена путают, правильней так


unit[3].channel[1] = 0x00000024 - коды ошибок на первом канале
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690205
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7каждый бит это номер ошибки
Почему нельзя хранить в исходном виде?
jenya7
Код: plaintext
1.
2.
3.
4.
5.
6.
typedef struct
{
    uint64_t channel_fail_codes[19];
}FAILURE_CODES;

FAILURE_CODES unit_failure_code[4];


unit_failure_code[4] это 608 байт

Откуда появилось 4864 байт ?

Если ошибок обычно немного, то 21647595
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690208
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7каждый бит это номер ошибки
Почему нельзя хранить в исходном виде?
jenya7
Код: plaintext
1.
2.
3.
4.
5.
6.
typedef struct
{
    uint64_t channel_fail_codes[19];
}FAILURE_CODES;

FAILURE_CODES unit_failure_code[4];


unit_failure_code[4] это 608 байт

Откуда появилось 4864 байт ?

Если ошибок обычно немного, то 21647595
откуда 608 байт? 4 установки по 19 каналов это 76 каналов - а в каждом канале 64 бита - а каждый бит это номер ошибки.
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690213
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7откуда 608 байт? 4 установки по 19 каналов это 76 каналов - а в каждом канале 64 бита - а каждый бит это номер ошибки.
Для справки: в одном байте 8 бит.
Код: sql
1.
4 * 19 * 64 / 8 = 608 байт
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690222
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри sizeof(unit_failure_code) - это общий размер массива в байтах.
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690224
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7откуда 608 байт? 4 установки по 19 каналов это 76 каналов - а в каждом канале 64 бита - а каждый бит это номер ошибки.
Для справки: в одном байте 8 бит.
Код: sql
1.
4 * 19 * 64 / 8 = 608 байт



а почему делить? каждый бит из 64 - это номер ошибки
тут
1000000000000000000000000000000000000000000000000000000000100100
мы имеем коды ошибок 2, 5 , 63
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690228
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ааа. понял где мы не понимаем друг друга - на каждый код я должен выделить байт - так как максималбный код - 63 - это 6 бит
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690236
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7ааа. понял где мы не понимаем друг друга - на каждый код я должен выделить байт - так как максималбный код - 63 - это 6 бит
Зачем хранить 1 бит в одном байте? Для чего?
Почему нельзя хранить в исходном виде?
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690239
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7ааа. понял где мы не понимаем друг друга - на каждый код я должен выделить байт - так как максималбный код - 63 - это 6 бит
Зачем хранить 1 бит в одном байте? Для чего?
Почему нельзя хранить в исходном виде?
потому что я не могу показать на экране
автор1000000000000000000000000000000000000000000000000000000000100100

я должен показать
автор03 01 02
03 01 05
03 01 63
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690251
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7я должен показать
Одно другому не мешает. Хранить не обязательно в том формате, в котором показывать.
Показать можно так
Код: plaintext
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.
typedef struct
{
	uint64_t channel_fail_codes[19];
}FAILURE_CODES;

FAILURE_CODES unit_failure_code[4];

void show() {
	printf("UNIT\tCHAN\tCODE\n");
	for(size_t u = 0; u != sizeof(unit_failure_code) / sizeof(FAILURE_CODES); u++) {
		for(size_t c = 0; c != sizeof(FAILURE_CODES::channel_fail_codes) / sizeof(uint64_t); c++) {
			uint64_t data = unit_failure_code[u].channel_fail_codes[c];
			if (data != 0) { // есть ошибки
				uint64_t mask = 1;
				for (size_t e = 0; e != 64; e++) {
					if ((data & mask) != 0) printf("%d\t%d\t%d\n", u, c, e);
					mask <<= 1;
				}
			}
		}
	}
}

int main()
{
	unit_failure_code[3].channel_fail_codes[1] = 0x24;
	show();
}

...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690271
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7я должен показать
Одно другому не мешает. Хранить не обязательно в том формате, в котором показывать.
Показать можно так
Код: plaintext
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.
typedef struct
{
	uint64_t channel_fail_codes[19];
}FAILURE_CODES;

FAILURE_CODES unit_failure_code[4];

void show() {
	printf("UNIT\tCHAN\tCODE\n");
	for(size_t u = 0; u != sizeof(unit_failure_code) / sizeof(FAILURE_CODES); u++) {
		for(size_t c = 0; c != sizeof(FAILURE_CODES::channel_fail_codes) / sizeof(uint64_t); c++) {
			uint64_t data = unit_failure_code[u].channel_fail_codes[c];
			if (data != 0) { // есть ошибки
				uint64_t mask = 1;
				for (size_t e = 0; e != 64; e++) {
					if ((data & mask) != 0) printf("%d\t%d\t%d\n", u, c, e);
					mask <<= 1;
				}
			}
		}
	}
}

int main()
{
	unit_failure_code[3].channel_fail_codes[1] = 0x24;
	show();
}


это интересно. но тут есть проблема - каждый последующий код нужно показывать по нажатию кнопки - и нужно перескакивать -
последняя ошибка (63) - следующий канал - последний какнал (19) - следующая установка - и так далее.
я тут просимулировал в шарпе
Код: c#
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
state = State.UNIT_NUM;

unit[3].not_empty = true;

unit[3].channel_code[2] = 0x85;
            //3 2 0
            //3 2 2
            //3 2 7
unit[3].channel_code[4] = 0x18;
            //3 4 3
            //3 4 4

 private void buttonUp_Click(object sender, EventArgs e)
{
        BrowseFailCodes(UP);
}

private void buttonDown_Click(object sender, EventArgs e)
{
       BrowseFailCodes(DOWN); 
}

void BrowseFailCodes(int direction)
        {
            uint idx;

            if (state == State.UNIT_NUM)
            {
                if (direction == UP)
                    {
                    for (idx = next_unit_num; idx < 4; idx++)
                    {
                        //there are some channels with fail codes
                        if (unit[idx].not_empty)
                        {
                            unit_num = idx;

                            next_unit_num = idx + 1;
                            if (next_unit_num > 3)
                                next_unit_num = 0;

                            next_chan_num = 0;

                            state = State.CHAN_NUM;
                            break;
                        }
                    }
                }
            }

            if (state == State.CHAN_NUM)
            {
                if (direction == UP)
                {
                    for (idx = next_chan_num; idx < 19; idx++)
                    {
                        //there are some fail codes in the tube
                        if (unit[unit_num].channel_code[idx] > 0)
                        {
                            chan_num = idx;

                            next_chan_num = idx + 1;
                            //got ot the end - next unit
                            if (next_chan_num > 18)
                            {
                                next_chan_num = 0;
                                state = State.UNIT_NUM;
                            }

                            next_code_num = 0;

                            code_val = unit[unit_num].channel_code[chan_num];

                            state = State.CODE_NUM;
                            break;
                        }
                    }
                }
            }

            if (state == State.CODE_NUM)
            {
                if (direction == UP)
                {
                    //get next failure code
                    for (idx = next_code_num; idx < 64; idx++)
                    {
                        //fail code found
                        if ((code_val & 0x01) == 1)
                        {
                            code_num = idx;
                            next_code_num = idx + 1;
                            if (next_code_num > 63)
                            {
                                next_code_num = 0;

                                state = State.CHAN_NUM;
                                break;
                            }

                            //display the failure code
                            state = State.DISPLAY;
                            break;
                        }
                        else
                        {
                            code_val >>= 1;
                            next_code_num++;
                            //got to the end - next channel
                            if (next_code_num > 63)
                            {
                                next_code_num = 0;

                                state = State.CHAN_NUM;
                                break;
                            }
                        }
                    }
                }
            }

            if (state == State.DISPLAY)
            {
                textBoxPgrlNum.Text = unit_num.ToString();
                textBoxTubeNum.Text = chan_num.ToString();
                textBoxCodeNum.Text = code_num.ToString();

                code_val >>= 1;

                state = State.CODE_NUM;
            }

        }


работает но уж очень криво. и только вверх.
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690277
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если C# то почитай про yield
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690283
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЕсли C# то почитай про yield
это только для отладки алгоритма. а работать он должен в голом С.
...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690321
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Dima TЕсли C# то почитай про yield
это только для отладки алгоритма. а работать он должен в голом С.
Вынеси индексы циклов в отдельную структуру.
Пример
Код: plaintext
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
typedef struct {
	int u;
	int c;
	int e;
} ONE_ERROR;

void error_init(ONE_ERROR *e) {
	e->u = -1;
}

bool error_next(ONE_ERROR *e) {
	if(e->u == -1) {
		e->u = 0;
		e->c = 0;
		e->e = 0;
	} else {
		e->e++;
	}
	for (; e->u != sizeof(unit_failure_code) / sizeof(FAILURE_CODES); e->u++) {
		for (; e->c != sizeof(FAILURE_CODES::channel_fail_codes) / sizeof(uint64_t); e->c++) {
			uint64_t data = unit_failure_code[e->u].channel_fail_codes[e->c];
			if (data != 0) { // есть ошибки
				uint64_t mask = 1<<(e->e);
				for (; e->e != 64; e->e++) {
					if ((data & mask) != 0) return true;
					mask <<= 1;
				}
			}
			e->e = 0;
		}
		e->c = 0;
	}
	return false;
}

void show2() {
	printf("UNIT\tCHAN\tCODE\n");
	ONE_ERROR e;
	error_init(&e);
	while(error_next(&e))  printf("%d\t%d\t%d\n", e.u, e.c, e.e);
}

int main()
{
	unit_failure_code[3].channel_fail_codes[2] = 0x85;
	unit_failure_code[3].channel_fail_codes[4] = 0x18;
	show2();
}

...
Рейтинг: 0 / 0
Алгоритм перебора кодов ошибок. Как лучше?
    #39690331
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7пропущено...

это только для отладки алгоритма. а работать он должен в голом С.
Вынеси индексы циклов в отдельную структуру.
Пример
Код: plaintext
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
typedef struct {
	int u;
	int c;
	int e;
} ONE_ERROR;

void error_init(ONE_ERROR *e) {
	e->u = -1;
}

bool error_next(ONE_ERROR *e) {
	if(e->u == -1) {
		e->u = 0;
		e->c = 0;
		e->e = 0;
	} else {
		e->e++;
	}
	for (; e->u != sizeof(unit_failure_code) / sizeof(FAILURE_CODES); e->u++) {
		for (; e->c != sizeof(FAILURE_CODES::channel_fail_codes) / sizeof(uint64_t); e->c++) {
			uint64_t data = unit_failure_code[e->u].channel_fail_codes[e->c];
			if (data != 0) { // есть ошибки
				uint64_t mask = 1<<(e->e);
				for (; e->e != 64; e->e++) {
					if ((data & mask) != 0) return true;
					mask <<= 1;
				}
			}
			e->e = 0;
		}
		e->c = 0;
	}
	return false;
}

void show2() {
	printf("UNIT\tCHAN\tCODE\n");
	ONE_ERROR e;
	error_init(&e);
	while(error_next(&e))  printf("%d\t%d\t%d\n", e.u, e.c, e.e);
}

int main()
{
	unit_failure_code[3].channel_fail_codes[2] = 0x85;
	unit_failure_code[3].channel_fail_codes[4] = 0x18;
	show2();
}


понял. спасибо. попробую. выглядит красиво )))
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм перебора кодов ошибок. Как лучше?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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