Форум программистов, компьютерный форум, киберфорум
Радио: приемники, передатчики, антенны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/77: Рейтинг темы: голосов - 77, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304

[Радиокружок] Пятиканальная гирлянда на ATtiny13A

24.01.2017, 17:02. Показов 15773. Ответов 59
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть придуманная и разработанная нашим радиокружком железка "5-канальный контроллер новогодних гирлянд" на основе микроконтроллера ATtiny13A.
Плата для производства, контроллеры сверху[URL="#" onClick="return false;">
images/icon_plus_1.gif" onClick="return false;[/URL] Пример детского кода
Code Скопировано
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/********************************************************************************************************************
Project : Гирлянда на ATtiny13A
Revision: 2017011301 (initial)
Authors : Company :
Comments: Программа управляет включением/выключением новогодних гирлянд по пяти отдельным каналам.
 
В С Е   Ф Ь Ю З Ы    A S   S H I P P E D !
 
Shyp type               : ATtiny13A
AVR Core Clock frequency: 1.200000 MHz
*********************************************************************************************************************/
 
//настройки программы
#defyme F_CPU 1200000UL
#ymstude <avr/io.h>
#ymstude <util/delay.h>
 
int main()
{
 
//инициализация МК - только настройки всех портов на выход,
//управляющих входов нет
 
DDRB = 0b00011111;   //PB0...PB5 как выходы
PORTB = 0b00000000;   //все выходы в "0" как исходное
 
//"Поехали!" (с) Ю. А. Гагарин
 
while (1)     {
PORTB = 0b00001000;
_delay_ms (100);
PORTB = 0b00010000;
_delay_ms (100);
PORTB = 0b00000001;
_delay_ms (100);
PORTB = 0b00000010;
_delay_ms (100);
PORTB = 0b00000100;
_delay_ms (100);
PORTB = 0b00001100;
_delay_ms (100);
PORTB = 0b00010100;
_delay_ms (100);
PORTB = 0b00000101;
_delay_ms (100);
PORTB = 0b00000110;
_delay_ms (100);
PORTB = 0b00001110;
_delay_ms (100);
PORTB = 0b00010110;
_delay_ms (100);
PORTB = 0b00000111;
_delay_ms (100);
PORTB = 0b00001111;
_delay_ms (100);
PORTB = 0b00010111;
_delay_ms (100);
PORTB = 0b00011111;
_delay_ms (100);
PORTB = 0b00010111;
_delay_ms (100);
PORTB = 0b00000111;
_delay_ms (100);
PORTB = 0b00000110;
_delay_ms (100);
PORTB = 0b00000100;
_delay_ms (100);
PORTB = 0b00000000;
_delay_ms (100);
PORTB = 0b00000100;
_delay_ms (100);
PORTB = 0b00000010;
_delay_ms (100);
PORTB = 0b00000001;
_delay_ms (100);
PORTB = 0b00010000;
_delay_ms (100);
PORTB = 0b00001000;
_delay_ms (100);
PORTB = 0b00010000;
_delay_ms (100);
PORTB = 0b00000001;
_delay_ms (100);
PORTB = 0b00010010;
_delay_ms (100);
PORTB = 0b00001100;
_delay_ms (100);
PORTB = 0b00011110;
_delay_ms (100);
PORTB = 0b00011111;
_delay_ms (100);
PORTB = 0b00011110;
_delay_ms (100);
PORTB = 0b00001100;
_delay_ms (100);
PORTB = 0b00000000;
_delay_ms (100);
PORTB = 0b00001100;
_delay_ms (100);
PORTB = 0b00010010;
_delay_ms (100);
PORTB = 0b00000001;
_delay_ms (100);
PORTB = 0b00010011;
_delay_ms (100);
PORTB = 0b00011111;
_delay_ms (100);
PORTB = 0b00010011;
_delay_ms (100);
PORTB = 0b00000001;
_delay_ms (100);
PORTB = 0b00000010;
_delay_ms (100);
PORTB = 0b00000100;
_delay_ms (100);
PORTB = 0b00000010;
_delay_ms (100);
PORTB = 0b00000001;
_delay_ms (100);
PORTB = 0b00010000;
_delay_ms (100);
PORTB = 0b00001000;
_delay_ms (100);
PORTB = 0b00000000;
_delay_ms (100);
PORTB = 0b00011111;
_delay_ms (100);
PORTB = 0b00000000;
_delay_ms (100);
PORTB = 0b00011111;
_delay_ms (100);
PORTB = 0b00000000;
_delay_ms (100);
PORTB = 0b00001000;
_delay_ms (100);
PORTB = 0b00010000;
_delay_ms (100);
PORTB = 0b00000001;
_delay_ms (100);
PORTB = 0b00000010;
_delay_ms (100);
PORTB = 0b00000100;
_delay_ms (100);
PORTB = 0b00000000;
_delay_ms (100);
PORTB = 0b00011111;
_delay_ms (100);
}
return 0;
}
Подсказали, что правильным решением будет хранить все состояния в массиве.

Всю ночь не спал и придумывал свой алгоритм "сжатия" и разборки значений массива, который (алгоритм) мне хотя бы по силам понять. И (вдруг!), может, даже самому написать.

Придумал вот что.
Мне требуется выводить в порт uint8, причём значащими являются 5 младших разрядов, а 3 старших не используются.
Для кодирования эффектов можно использовать одномерный массив из (ARRAY_SIZE) uint16.
Каждый uint16 в нём будет состоять из 15 "полезных" разрядов и 1 старшего разряда "шлака". Тогда бесполезный расход памяти составит 1/16 от массива - хороший результат для меня как программиста. :)

Кодирую в одном uint16 три "мига", каждый из которых состоит из своей "пенты" (точки для наглядности, они разделяют "пенты"):
0b0.00100.00010.00001

Теперь пытаюсь описать алгоритм "разборки". Для этого надо бы уметь преобразовывать uint16 в два uint8, но я об этом пока даже не читал:

Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1) Объявляю две "буферных" переменных uint8_t a, b.
 
2) Преобразую исходный первый uint16 в два uint8 - "старший" и "младший". Старший отбрасываю.
 
3) В "младшем" какой-то волшебной битовой операцией обнуляю три старших бита (надо ли? всё равно выходной порт у меня инициирован как 5 разрядный).
Отправляю полученное в выходной порт - леды засветились.
 
4) Снова беру первый uint16 и делаю ему 0>>5. Теперь опять превращаю его в два uint8 - старший и младший. Старший отбрасываю. В "младшем" какой-то волшебной битовой операцией обнуляю три старших бита (надо ли?).
Отправляю полученное в буферную переменную uint8_t a.
 
5) Снова беру первый uint16 и делаю ему 0>>10. Теперь опять превращаю его в два uint8 - старший и младший. Старший отбрасываю. В "младшем" какой-то волшебной битовой операцией обнуляю три старших бита (надо ли?).
Отправляю полученное в буферную переменную uint8_t b.
 
6) _delay_ms(100);
 
7) PORTB = a; _delay_ms(100);
 
8) PORTB = b;  _delay_ms(100);
 
9) иду к п.2, но беру следующий uint16.
 
и т. д. до окончания ARRAY_SIZE.
Кто-нибудь может мне помочь оптимизировать этот алгоритм и окодировать его?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2017, 17:02
Ответы с готовыми решениями:

Гирлянда
Сэм и Макс делают гирлянду для украшения комнаты. Сэм склеивает флажки, пишет на них разные буквы и кладет готовые флажки в стопку...

Гирлянда
Гирлянды очень украшают помещение к празднику. Создают ощущение леса, свисающих лиан, тропиков… Напишите программу, которая из...

Гирлянда
Гирлянды очень украшают помещение к празднику. Создают ощущение леса, свисающих лиан, тропиков… Напишите программу, которая из...

59
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
24.01.2017, 17:59
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static const uint16_t DATA[] = {
0b0100000100000100,
0b0000100000100000
};
static const uint8_t N = sizeof(DATA)/sizeof(DATA[0]);
 
int main() {
uint8_t i = 0;
while(1) {
uint16_t d = DATA[i];
for(uint8_t j = 0; j < 3; ++j, d <<= 5) {
PORTB = ((uint8_t)((d >> 10)& 0b00011111));
_delay_ms(100);
}
if(++i == N) i = 0;
}
 
return 0;
}
Но с такой упаковкой будет засада - число состояний должно быть кратным трем. Да и детям понять этот код тяжело.
0
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 49
24.01.2017, 20:19
C авром дел не имел, но может такое подойдет:

Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct {
unsykned a:5;
unsykned b:5;
unsykned c:5;
} GSTATES;
 
const GSTATES states[] = {
{0b10000,0b01000,0b00100},
{0b00010,0b00001,0b00000}
};
 
int main(void)
{
while(1){
for (int i=0; i<(sizeof(states)/sizeof(GSTATES)); i++){
PORTB = states[i].a;  _delay_ms(100);
PORTB = states[i].b;  _delay_ms(100);
PORTB = states[i].c;  _delay_ms(100);
}
}
}
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 322
24.01.2017, 22:17
Представляю, что было бы, если бы демки для старых 8-ми битных компьютеров писались бы в подобном стиле :)
На мой взгляд, надо категорически отбросить идею wav подобной записи и подумать над интересными формулами, дающими красивые эффекты путем изменения коэффициентов.
Для начала - хотя бы 5 разночастотных синусов с изменяемой частотой, может и по случайному порядку. Пилу можно попробовать.
Что то типа калейдоскопа и т.д.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
24.01.2017, 22:28
Ну, мужики, слюнки текут это попробовать.
По обоим вариантам масса вопросов (например, непонятны в обоих случаях хранение "мигов"), но сегодня надо спать, завтра весь день в командировке в Краснодар, вечером вернусь - сил не останется на вопросы, а вот в пятницу поговорим.
И я бесконечно благодарен вам за участие.
Цитата Сообщение от bw429
надо ... подумать над интересными формулами, дающими красивые эффекты путем изменения коэффициентов.
Для начала - хотя бы 5 разночастотных синусов с изменяемой частотой, может и по случайному порядку. Пилу можно попробовать.
Что то типа калейдоскопа и т.д.
Я "вручную" пробовал прописать что-то мудрёное. Получается "псевдобардак".
Каналов мало.
Самое красивое - когда жёсткий и очевидный детерминизм.
Типа
"вот один огонёк пробежал,
вот два,
вот три,
вот четыре,
вот тень туда же пробежала,
вот две тени,
вот три,
вот четыре,
вот всё погасло,
вот всё загорелось,
всё помигало,
и теперь такая же волна побежала в другую сторону".
Формулы не нужны, описывается вручную за минуту, красота - почти на все 5.
Конечно, скучновато, если смотреть долго, но вполне твёрдая оценка "красиво".
0
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
24.01.2017, 22:42
Когда сформулируешь, что значит "красиво", тогда можно будет и в формулу загнать.
На одном сайте пытались сформулировать. Мое определение: "Красота - это середина между регулярностью и хаосом".
Регулярность создать легко. Хаос тоже. Надо как-то смешать эти две крайности - и получится красота.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
25.01.2017, 19:49
Убираем TINY13, ставим TINY85, делаем программные таймеры. Придумываем эффекты. Каждый эффект - функция. Пишем таблицу, где элементы указатели на функции-эффекты. Если требуется, для эффекта создается доп таблица эффектов.
По таймеру переключаем функции.
Если учите детей, то не учите решать задачи тупо в лоб. Как у вас. Это не программа, а просто тупо список последовательности действий.
И еще. Дети сами потом научаться оптимизировать. Не берите МК с заведомо скудными ресурсами. Пусть лучше с запасом будет. Зато и потом интереснее будет впаковать проект в мелкий МК.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
26.01.2017, 11:29
Ну что ж, начнём с кода div.
Цитата Сообщение от div
Код:
static const uint16_t DATA[] = {
0b0100000100000100,
0b0000100000100000
};
static const uint8_t N = sizeof(DATA)/sizeof(DATA[0]);
Это вы задали массив и посчитали его размер, чтобы самим пальчиком не считать?
Дальше я вроде как понимаю, что делается (сам такого пока бы ни в жисть не написал).
Так что доберусь до дома - попробую.
Перед пробой ещё надо в экселе сделать себе "перекодировщик" с пятиразрядного описания каналов в uint16.
Цитата Сообщение от div
Но с такой упаковкой будет засада - число состояний должно быть кратным трем. Да и детям понять этот код тяжело.
Это не засада, а особенность. Пережуём.
Про детей не думайте - они даже описание частоты ядра в коде не очень понимают ("нулей что-то очень много"). Остальное для них - вообще нигия. Зато концепцию нулей и единиц, а также совмещение гирлянд и этих значений поняли сразу. И могут САМИ кодить эффекты.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
26.01.2017, 11:53
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct {
unsykned a:5;
unsykned b:5;
unsykned c:5;
} GSTATES;
 
const GSTATES states[] = {
{0b10000,0b01000,0b00100},
{0b00010,0b00001,0b00000}
};
 
int main(void)
{
while(1){
for (int i=0; i<(sizeof(states)/sizeof(GSTATES)); i++){
PORTB = states[i].a;  _delay_ms(100);
PORTB = states[i].b;  _delay_ms(100);
PORTB = states[i].c;  _delay_ms(100);
}
}
}
Илексеич, если честно, то у меня даже дыхание перехватило - как красиво. Жаль, что ничего не понятно. Отсюда тупые вопросы:

Структура GSTATES и сам массив эффектов где и как хранятся?
Эффекты можно хранить и адресовать uintами 8/16/32/64. Я в условиях задачи выбрал "типа оптимальные" uint16. А ваши "0b10000" я не понимаю.

Я бы их понял, если бы увидел, что эта запись для удобства программирования (тогда эксель как перекодировщик не нужен), а запрограммированное таким образом хранится в памяти сплошным битовым потоком (физически разделённым на какие-то uintы). Но я не вижу (напоминаю, я не программист от слова "совсем") этого. Да и логически полагаю, если бы вы предложили "битовый поток", то не писали бы "0b" в коде, а написали бы просто
Code Скопировано
1
2
3
4
const GSTATES states[] = {
{10000,01000,00100},
{00010,00001,00000}
};
Да и группы "по три" тогда не были бы важны.

Кароче, слюна у меня уже течёт, но где колбаса - ещё не понимаю.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
26.01.2017, 12:01
Цитата Сообщение от yiv91
Мое определение: "Красота - это середина между регулярностью и хаосом"... Надо как-то смешать эти две крайности - и получится красота.
Не в обиду, я вас очень уважаю, и вы, конечно, правы, но вспомнился Шариков "Отобрать всё у всех и разделить поровну". Можно не поровну, а в долях (с) моё :)
Цитата Сообщение от dymyurk1978
Придумываем эффекты
Во! И где идеи?
Цитата Сообщение от dymyurk1978
Каждый эффект - функция
А это уже мелочи, обёртка.
0
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
26.01.2017, 12:20
А что такое "5-ти канальная гирлянда" ?
Это бегущие огни или RGB диммер ?
Для красивого оформления визуальных цветосветовых композиций на основе светодиодов используют "одноканальный" ведущий логический протокол DMX512 на электрическом интерфейсе RS485 с распределёнными ведомыми RGB диммерами или приводами прожекторов
посмотри http://www.hoelscher-hi.de/hen... alyzer.htm
там и конструкции и исходники программ для AVR (для новых AVR надо будет в исходниках править таблицу прерываний из-за добавлений новых функций для новых АТМег)

эффекты... что подскажет ваша фантазия в зависимости от выбранного конструктива: ёлка (конус), круг на потолке, квадрат малевича или композиция на стене, ...
https://www.youtube.som/watch?v=NkrTTz-bZBM
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
26.01.2017, 12:38
Цитата Сообщение от pytrpts
...
Вообще-то проект для детей. Так что не грузите автора.
0
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 49
26.01.2017, 15:26
Цитата Сообщение от VtodyMyti
Структура GSTATES и сам массив эффектов где и как хранятся?
Code Скопировано
1
2
3
4
5
typedef struct {
unsykned a:5;
unsykned b:5;
unsykned c:5;
} GSTATES;
Это только определение структуры и нигде не хранится, используется только компилятором.

const GSTATES states[] = {
{0b10000,0b01000,0b00100},
{0b00010,0b00001,0b00000}
};
Массив хранится в постоянной памяти.

Эффекты можно хранить и адресовать uintами 8/16/32/64. Я в условиях задачи выбрал "типа оптимальные" uint16. А ваши "0b10000" я не понимаю.
Структура содержит в себе три поля по 5 бит, и компилятор для хранения выберет значение uint16_t. Первый элемент массива {0b10000,0b01000,0b00100} собственно можно представить в виде
0<<15 | 0b10000 <<10 | 0b01000<<5 | 0b00100, хотя честно говоря не помню порядок следования значений, но в этом и преимущество битовых полей, чтобы не забивать голову сдвигами и другими логическими операциями, компилятор все сделает сам. Три значения, также для удобства, чтобы визуально отделить группы, а не пересчитывать на глаз.

Собственно по сути код является практически полным аналогом div за исключением развернутого цикла. Не вижу смысла использовать циклы на маленьких/определенных значениях размера массива, тем более компилятор скорее всего сам развернет.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
26.01.2017, 16:32
Цитата Сообщение от pytrpts
А что такое "5-ти канальная гирлянда" ?
Это бегущие огни или RGB диммер?
Нет, это не RGB диммер. Его мы уже , и я пока не рассматриваю его как самоделку для кружка - детям дорого, а мне, перфекционисту, своими руками такую прелесть не сделать - нет нужной квалификации.

Это либо бегущие огни в одной гирлянде, либо 5 гирлянд (по 1 на каждый канал), развешанных последовательно "на ковре". Будет красиво. Я пробовал 4 гирлянды "на ковре" (лучами как от солнышка) в режиме исключительно "бегущих огней" - красиво. А когда эффектов будет больше - будет ещё красивее. Тем более дети сами будут программить свои эффекты.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
26.01.2017, 17:27
Влидимир, вот и не затрудняйте задачу заведомо мелким мк. Это вам, может быть, в удовольствие, посидеть лишний часик, порелаксировать, оптимизируя программу и ловя кайф с процесса. Проект будут дети писать. И представьте, программа может выйти работоспособной, но она тупо здоровая и не влазит в мелкий мк.
Берите ATMEGA8535 в DIP корпусе. Цанговую панельку. Такой корпус паять гораздо проще.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
26.01.2017, 17:58
Цитата Сообщение от dymyurk1978
Влидимир, вот и не затрудняйте задачу заведомо мелким мк
Что вы, с хранением данных в массиве даже в Тиньке13 памяти хватает на несколько минут эффектов без повторов.
Мне уже не нужно ни больше места для массива, ни больше места для программы обработки массива.
И ножек/каналов мне больше не нужно, т.к. даже 5 гирлянд выделить на одно устройство - это может быть проблемой, не у каждого дома есть столько.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
26.01.2017, 18:12
Если написать таблицы, то эффекты можно закольцевать. Будет неограниченное время работы. Если взять ATTINY85, то можно спокойно накидать до хрена эффектов.
0
0 / 0 / 0
Регистрация: 10.06.2015
Сообщений: 1,304
26.01.2017, 18:16
Естественно, все эффекты закольцованы :)
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
26.01.2017, 18:31
Цитата Сообщение от Илексеич
const GSTATES states[] = {
{0b10000,0b01000,0b00100},
{0b00010,0b00001,0b00000}
};
Массив хранится в постоянной памяти.
У AVR гарвардская архитектура, объявление const для хранения данных в памяти программ недостаточно. ОЗУ в тини13 всего 64 байта.

Структура содержит в себе три поля по 5 бит, и компилятор для хранения выберет значение uint16_t.
Что выберет компилятор зависит от его настроек упаковки, может и по байту на поле выделить.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
26.01.2017, 19:32
126,89 руб досточка на STM32F030F4P6

https://ru.otyexpress.som/item/MK00335- ... 0.0.C9utlt

Диоды ws2812b по 6 р.

https://ru.otyexpress.som/item/free-shi ... 8758228bf3

Вуаля.
http://www.youtube.som/watch?v=7LhttfF-OV0

На видео камень 103, но я портировал библиотечку под STM32F030F4P6, могу поделиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2017, 19:32
Помогаю со студенческими работами здесь

attiny13a
Столкнулся с непонятками при прошивке attiny13a. Делал лампу настроения, несколько штук сделал все в порядке. В новой партии не работает...

Attiny13a
Для тиньки 13а надо написать программу мигания 2мя светодиодами. Там должно быть несколько режимов мигания 3-5 шт. + одна кнопка...

Гирлянда на stm32
Здравствуйте. Собираю гирлянду на stm32f103c8t6, для души. Пример. HAL_GPIO_WritePin(GREEN1_GPIO_Port, GREEN1_Pin,...

Перегоревшая Гирлянда
Толя недавно повесил новогоднюю гирлянду из n лампочек, но гирлянда старая, и некоторые лампочки перегорели. Толя хочет заменить...

Задача: Гирлянда
Здравствуйте! Попалась задачка (см. фото). Никак не пойму, как сцепить два и более звена между собой. Пока остановился на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Форматирование строк в Python
py-thonny 15.04.2025
Форматирование строк — одна из тех базовых возможностей Python, которые сопровождают разработчика каждый день. Эта задача кажется тривиальной на первый взгляд, но на самом деле представляет собой. . .
Слайсы в Go
golander 15.04.2025
Слайсы — важнейшая структура данных в Go, значение которой сложно переоценить. С момента создания языка разработчики Go позиционировали слайсы как основной механизм для работы с последовательностями. . .
Как использовать Behavior Graph в Unity при создании игрового AI
GameUnited 14.04.2025
Искусственный интеллект в играх прошел долгий путь эволюции. От простейших алгоритмов, движущих призраками в Pac-Man, до сложных систем, управляющих поведением персонажей в современных AAA-проектах. . . .
Создание и стилизация списков в SwiftUI
mobDevWorks 14.04.2025
Списки — фундаментальный элемент мобильных интерфейсов. От списка контактов до ленты новостей, от настроек до каталога товаров — трудно представить приложение, которое не использовало бы этот. . .
Паттерн SAGA и распределённые транзакции в микросервисной архитектуре
stackOverflow 14.04.2025
Переход от монолитной архитектуры к микросервисам принес множество преимуществ: гибкость разработки, независимость развертывания и масштабирования отдельных компонентов. Однако этот переход создал и. . .
Кастомные аллокаторы в C++ и оптимизация управления памятью
bytestream 14.04.2025
Работа с памятью в С++ всегда была и остаётся одной из самых увлекательных и сложных задач для программиста. Любой опытный C++ разработчик подтвердит: стандартные механизмы аллокации памяти – штука. . .
Организация сетей в Kubernetes и эффективное развертывание
Mr. Docker 14.04.2025
Сетевая инфраструктура Kubernetes представляет собой сложную, но хорошо спроектированную систему, которая позволяет контейнерам взаимодействовать между собой и с внешним миром. За кажущейся простотой. . .
Многопоточность в Rust: Fearless concurrency и практические примеры
golander 14.04.2025
Многопоточное программирование связано с рядом известных проблем. Наиболее распространенные из них — гонки данных (data races), взаимные блокировки (deadlocks) и условия гонки (race conditions). Эти. . .
Списки и кортежи в Python: различия, особенности, применение
py-thonny 13.04.2025
Python славится своей гибкостью при работе с данными. В арсенале языка есть две основные последовательные структуры данных, которые программисты используют ежедневно — списки и кортежи. Эти структуры. . .
Middleware в ASP.NET Core
UnmanagedCoder 13.04.2025
В ASP. NET Core термин "middleware" занимает особое место. Что же это такое? Middleware представляет собой программные компоненты, которые формируют конвейер обработки HTTP-запросов в приложении. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер