Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250

Как работает union в С++

01.11.2024, 15:47. Показов 5690. Ответов 91
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста.
Как работает union в С++
Везде написано, что элементы union, занимают одну область памяти.
Область памяти размером по наибольшему элементу.

C++
1
2
3
4
5
union Foo
{
   int a;
   char b;
};
Если я присвою int какое либо значение.
И присвою значение для char.
И учитывая, что они занимают одну область памяти.
Значит char должна затереть часть битов int.
И int перестанет иметь прежнее значение.

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2024, 15:47
Ответы с готовыми решениями:

Union как работает?
union U { double f; long l; int d; }; U un; un.f = 0; un.l = 10; cout << un.f; почему выводит 4.94066e-323 ? я так понял это...

union как определить из какой таблице запись после UNION?
Подскажите пожалуйста! Вот например две таблице (TEBLE_1) у которой поля row_1(BIGINT) и (TABLE_2) у которой поля row_2(TEXT) Я ИХ...

функция union что выводит на консоль? как работает?
union U { double f; long l; int d; }; U un; un.f = 0; un.l = 10; cout << un.f; И что выведет на экран?

91
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
01.11.2024, 18:28
Студворк — интернет-сервис помощи студентам
Verevkin, это не разрешается программисту, а компилятор - он глупый, он верит человеку

Например, не разрешается разыменовывать нулевой или провисший указатель. Не разрешается организовывать гонку данных. Не разрешается нарушать strict aliasing.
Но компилятор всё это преспокойно пропускает.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.11.2024, 18:52
Цитата Сообщение от Verevkin Посмотреть сообщение
Что такое активность члена union?
Попросту выражаясь, тот член, в который последним выполнялась запись - активный. Остальные - неактивны.

Цитата Сообщение от Verevkin Посмотреть сообщение
Это ж просто начальный адрес в памяти. И всё.
При чем здесь начальный адрес в памяти и каким боком это относится к С++ - мне не ясно.

Цитата Сообщение от Verevkin Посмотреть сообщение
то компилятор обязан это не пропустить.
Во-первых, в С++ существует большое количество ошибок времени компиляции, которые являются недиагностируемыми ("no diagnostic required"). Так что ни о каком "обязан" речи никогда не шло даже в случае ошибок, которые компилятор теоретически может отловить

Во-вторых, к "не разрешается" я также отношу неопределенное поведение, как в данном случае.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 19:30
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Попросту выражаясь, тот член, в который последним выполнялась запись - активный. Остальные - неактивны.
Первый раз такое слышу. Пруфы, хоть, дай.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
При чем здесь начальный адрес в памяти и каким боком это относится к С++ - мне не ясно.
Ну, переменная типа union (и её поля) - это жэж начальный адрес данных, которые она (они) хранит (хранят). А типы полей определяют их размеры, причём самое длинное поле задаёт размер всего union. В Си и паскале - так. Разве в С++ это не так? Почему? А как тогда?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
к "не разрешается" я также отношу неопределенное поведение, как в данном случае.
Я помню, Задорнов говорил про 3 типа "нельзя": "запрещено", "строго запрещено" и "категорически запрещено!!!".
Ну, поржать можно, однако, что не так c кодом моего примера? Что в нём может пойти не так? Покажи, пожалуйста, на практике, а то я не смогу в это поверить: у меня слово "недопустимо" ассоциируется именно c "категорически запрещено".

Очень прошу, Маэстро!

Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это не разрешается программисту, а компилятор - он глупый, он верит человеку
Например, не разрешается разыменовывать нулевой или провисший указатель. Не разрешается организовывать гонку данных. Не разрешается нарушать strict aliasing.
Но компилятор всё это преспокойно пропускает.
Здесь - не тот случай. Не передёргивай.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 19:53
Цитата Сообщение от Verevkin Посмотреть сообщение
Пруфы
In a union, a non-static data member is active if its name refers to an object whose lifetime has begun and has not ended ([basic.life]).
At most one of the non-static data members of an object of union type can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.

[Note 1: One special guarantee is made in order to simplify the use of unions: If a standard-layout union contains several standard-layout structs that share a common initial sequence ([class.mem]), and if a non-static data member of an object of this standard-layout union type is active and is one of the standard-layout structs, the common initial sequence of any of the standard-layout struct members can be inspected; see [class.mem].
— end note]
https://eel.is/c++draft/class.union#general-2

Добавлено через 5 минут
... if the object is a union member or subobject thereof, its lifetime only begins if that union member is the initialized member in the union ([dcl.init.aggr], [class.base.init]), or as described in [class.union], [class.copy.ctor], and [class.copy.assign], and except as described in [allocator.members].
The lifetime of an object o of type T ends when:

(1.3) if T is a non-class type, the object is destroyed, or
(1.4) if T is a class type, the destructor call starts, or
(1.5) the storage which the object occupies is released, or is reused by an object that is not nested within o ([intro.object]).
https://eel.is/c++draft/basic.life#1.2

Т.е. если всё сложить, то при перезаписи одного объекта в union, ты убиваешь (завершаешь жизнь) другого. А значит другой нельзя читать. Читать из него - то же самое, что читать из неинициализированной переменной. Такое же UB.

Добавлено через 2 минуты
А в Note 1 первой цитаты написано вот это:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов. Вот эти общие начальные последовательности можно просматривать, игнорируя соображения текущего активного члена. То есть вот так можно
Добавлено через 2 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
это жэж начальный адрес данных, которые она (они) хранит (хранят)
Не, в C++ - это объекты сперва, а потом уже память. А в C++ нельзя читать из мёртвых объектов. Неважно каким способом ты их получил.
Если ты про это не слышал, то просто видимо не читал никакой серьезной литературы по С++.
1
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 20:02
Цитата Сообщение от ablex Посмотреть сообщение
Т.е. если всё сложить, то при перезаписи одного объекта в union, ты убиваешь (завершаешь жизнь) другого.
Но поля-то статические, под них выделена память на всё время жизни переменной, ёмаё. Разве время жизни полей не равно времени жизни всего union?

Как это работает на низком уровне-то?
Я понимаю, что там написано, но я не понимаю смысл этого, как это выглядит на практике. Вон у ТС даже картинка в вопросе есть. Как надо подкрутить настройки компилятора, чтобы пример стал выдавать неверный результат?

Добавлено через 4 минуты
Цитата Сообщение от ablex Посмотреть сообщение
Если ты про это не слышал, то просто видимо не читал никакой серьезной литературы по С++.
Иногда меня терзают смутные сомнения, что всё, что написано в серьёзной литературе, правда.
Если взять в качестве примера наш текущий случай, то я ума не разложу, зачем так сделано? Чтобы было неудобно? Получается, что поля каким-то волшебным образом имеют разное время жизни, которое заранее неизвестно. Зачем?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.11.2024, 20:16
Цитата Сообщение от Verevkin Посмотреть сообщение
Первый раз такое слышу.
Ну это уж точно неправда. Тема уже миллион раз тут обсуждалась.

Цитата Сообщение от Verevkin Посмотреть сообщение
Пруфы, хоть, дай.
Вперёд читать стандарт. Ключевые слова я дал: union, active member, lifetime.

Переключение активного члена union заканчивает lifetime предыдущего активного члена. Чтение объекта, чей lifetime закончился - неопределенное поведение. (12.3, 6.8)

Цитата Сообщение от Verevkin Посмотреть сообщение
Ну, переменная типа union (и её поля) - это жэж начальный адрес данных, которые она (они) хранит (хранят).
Какие еще "адреса данных"? Какая разница, какие там адреса? Зачем вы вообще на них смотрите? Это все детали реализации, которые к языку С++ никакого отношения не имеют.

Цитата Сообщение от Verevkin Посмотреть сообщение
Разве в С++ это не так?
Какая разница, так это или не так. Язык С++ говорит, что чтение неактивного члена union - неопределенное поведение. Какая разница, что там "определяет размеры"?

Добавлено через 10 минут
Цитата Сообщение от Verevkin Посмотреть сообщение
Как это работает на низком уровне-то?
Что за набор слов? О какой "работе" (на любом уровне) может идти речь в случае неопределенного поведения?

Цитата Сообщение от Verevkin Посмотреть сообщение
Я понимаю, что там написано, но я не понимаю смысл этого, как это выглядит на практике.
Продолжается поток бессмыслицы. О какой "практике" может идти речь в случае неопределенного поведения?

На практике неопределенное поведение существует для оптимизаций. Компилятор оптимизирует код в рамках уверенности, что неопределенное поведение никогда не происходит. В частности, если неукий код содержит безусловное неопределенное поведение (напр., запись в одно поле union и чтение из другого), значит эта ветвь программы никогда не будет выполняться и код для нее можно не генерировать вообще. А вы нам тут про какие-тот адреса рассказывать пытаетесь...
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 20:17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какие еще "адреса данных"? Какая разница, какие там адреса? Зачем вы вообще на них смотрите? Это все детали реализации, которые к языку С++ никакого отношения не имеют.
Не понял. А как это тогда вообще работает?
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 20:19
Цитата Сообщение от Verevkin Посмотреть сообщение
Иногда меня терзают смутные сомнения, что всё, что написано в серьёзной литературе, правда.
Программист должен уметь читать спецификацию.

Цитата Сообщение от Verevkin Посмотреть сообщение
Чтобы было неудобно?
Нет, просто это не тот инструмент. Хочешь работать с памятью - есть другие средства, предназначенные специально для этого.

Цитата Сообщение от Verevkin Посмотреть сообщение
зачем так сделано?
Чтобы все стройно работало. Если внутри union std::string и int, то такой код что тебе даст? Креш в лучшем случае.
Про strict aliasing почитай.
https://gist.github.com/shafik... ee272a58f8

ОДНАКО, не смотря на это, type punning через union все равно будет работать во многих компиляторах, потому что они (разрабы компиляторов) НАМЕРЕННО НЕ проводят оптимизации aliasing`а (оставляют поведение как в Си). Потому что многие программисты на Си продолжают тащить в Си++ этот приём, и это явление настолько массовое, что проще перестать соответствовать стандарту в этом моменте.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.11.2024, 20:24
Цитата Сообщение от Verevkin Посмотреть сообщение
Но поля-то статические, под них выделена память на всё время жизни переменной, ёмаё. Разве время жизни полей не равно времени жизни всего union?
Нет, конечно. Зачем выделять память под все поля, если в каждый момент времени активно только одно?

О какой вообще "памяти" вы вообще ведете речь? Что такое "выделена"? В С++ понятие "памяти" даже отдаленно не похоже на то, о чем вы здесь рассуждаете.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 20:26
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какая разница, так это или не так. Язык С++ говорит, что чтение неактивного члена union - неопределенное поведение. Какая разница, что там "определяет размеры"?
Если в стандарте так написано, значит так и есть?
Напоминает мамкин ответ "потому что я так сказала!" на вопрос "почему?".
Я не спорю, я просто пытаюсь разобраться, правда ли это, и почему (и для чего) так сделано. А то получается, что в С++ авторы понапихали UB-ситуаций и считают, что проще подкорректировать под них стандарт, чем исключить.



Как же мне повезло, что на работе я сам выбираю, на чём писать софт.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.11.2024, 20:27
Цитата Сообщение от Verevkin Посмотреть сообщение
Не понял. А как это тогда вообще работает?
Не понимаю вопроса. В чем проблема с "работает"?

Вот я, например, положил в переменную значение 25, не менял ее, и затем прочитал. Компилятор вообще устранил эту переменную, потому что понял, что она всегда равна 25. То есть нет никакой памяти, и при этом все работает.

Где проблема?
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 20:34
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, конечно. Зачем выделять память под все поля, если в каждый момент времени активно только одно?
Поскольку поля находятся по одному адресу, нужно столько памяти, сколько занимает поле максимального размера. Разве это не логично? Компилятор, ведь, знает размер в момент компиляции.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот я, например, положил в переменную значение 25, не менял ее, и затем прочитал. Компилятор вообще устранил эту переменную, потому что понял, что она всегда равна 25. То есть нет никакой памяти, и при этом все работает.
Это не наш случай. Вот если бы ты ничего не изменял, а прочитал бы мог бы прочитать вместо 25 значение 100500, то это UB.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.11.2024, 20:36
Цитата Сообщение от Verevkin Посмотреть сообщение
Если в стандарте так написано, значит так и есть?
Совершенно верно.

Цитата Сообщение от Verevkin Посмотреть сообщение
Напоминает мамкин ответ "потому что я так сказала!" на вопрос "почему?".
Нет. Вот это ^^^ очень характерное заблуждение.

Ребенок задает маме вопросы об окружающем мире, который для ребенка (да и для опытного ученого) -непознанный объект исследований, проводимых фактически методом "чёрного ящика", то есть методом научного тыканья палкой и наблюдения реакции.

Язык С++ же не надо исследовать методом "черного ящика". Он не прилетел к нам с другой планеты на дискете. В него не надо тыкать палкой. Он полностью описан в стандарте и любая реализация - попытка идеально точно соблюсти требования стандарта.


Цитата Сообщение от Verevkin Посмотреть сообщение
Как же мне повезло, что на работе я сам выбираю, на чём писать софт.
А подавляющем большинстве случаев это означает, что аффтар "пишет софт" на языке, который является продуктом его собственных домыслов чуть менее, чем полностью.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 20:42
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А подавляющем большинстве случаев это означает, что аффтар "пишет софт" на языке, который является продуктом его собственных домыслов чуть менее, чем полностью.
Да пусть, хотя бы, и так. Но аффтара это кормит. Чуть более, чем полностью.
-----
Не надо на личности переходить, это мы так щас до оскорблений опустимся. Не хочу.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 20:45
Цитата Сообщение от Verevkin Посмотреть сообщение
я просто пытаюсь разобраться, правда ли это, и почему (и для чего) так сделано.
Хошь разобраться - читай ссылку, которую я привел. Все остальное от лукавого.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.11.2024, 20:53
Цитата Сообщение от Verevkin Посмотреть сообщение
Поскольку поля находятся по одному адресу, нужно столько памяти, сколько занимает поле максимального размера. Разве это не логично? Компилятор, ведь, знает размер в момент компиляции.
Снова поток каких-то феерических домыслов.

"Адреса" в программе на С++ появляются только после того, как будет применен оператор взятия адреса &. Без этого никаких "адресов" не существует вообще. То же самое и с "размерами" (sizeof, адресная арифметика и т.п.). Без этого никаких размеров не существует вообще, максимальных или минимальных - неважно.

Еще раз повторяю (и я не люблю повторяться): так как активным в union является только один член, памяти всегда нужно ровно столько, сколько занимает это активный член. Никаких "максимальных размеров" здесь нет и не нужно. А все остальное - лишь детали реализации, ничего о сути вопроса нам не сообщающие.

Цитата Сообщение от Verevkin Посмотреть сообщение
Это не наш случай.
Это где я такое сказал? (Постарайтесь чтобы в будущем я не видел здесь подобных однострочных вбросов. Чтобы возражать мне в таких вопросах нужно подготовить странички три-четыре материала с отщывами рецензентов).

Как несложно догадаться, то, к чему я веду, в частности - это что union может располагаться в регистрах процессора и правильный менеджмент этих регистров определяется знанием о текущем активном члене union. Мой пример в том числе об этом.

А вы нам тут рассказываете сказки про какую-то "выделенную память", "максимальный размер", "располагаются на картинке" и т.п Ничего этого в С++ нет и никогда не было. Это пионэрские домыслы.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 20:55
Цитата Сообщение от ablex Посмотреть сообщение
Хошь разобраться - читай ссылку, которую я привел. Все остальное от лукавого.
За ссылку спасибо.
Раньше я понимал работу union как-то так:



Пойду чаёк заварю...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.11.2024, 21:03
Цитата Сообщение от Verevkin Посмотреть сообщение
.
Раньше я понимал работу union как-то так:
Вот именно такие попытки "понимать" С или С++ через разглядывание сгенерированного машинного кода - это и есть метод "тыканья палкой" в компилятор. Если "ученый" не обладает великолепным знанием стандарта языка, то такое разглядывание приведет лишь к рождению феерических теорий, вроде "безногий таракан не слышит" из известного анекдота.
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
01.11.2024, 21:16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Снова поток каких-то феерических домыслов.
Пусть это домыслы, но они основаны на практике. Разве sizeof(тип) может вернуть разные размеры в зависимости от его положения в коде?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот именно такие попытки "понимать" С или С++ через разглядывание сгенерированного машинного кода - это и есть метод "тыканья палкой" в компилятор. Если "ученый" не обладает великолепным знанием стандарта языка, то такое разглядывание приведет лишь к рождению феерических теорий, вроде "безногий таракан не слышит" из известного анекдота.
Согласен, пусть это так. Я не учёный, я рабочий. Ответ "так нельзя, потому что это написано в Писании стандарте", меня не устраивает. Я смотрю в сгенерированный машинный код и вижу, что "она вертится".
---------
Пойду спать. Всем спасибо за дискуссию.
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,646
Записей в блоге: 9
01.11.2024, 22:04
Цитата Сообщение от Алексей1153 Посмотреть сообщение
union задуман как возможность поэкономить озу. А для реинтерпретации есть memcpy
Почитался я вашу полемику насчёт union. Тут я за Verevkin-а.
Использовать для реинтерпретации memcpy, да даже и приведение типа указателей к другому типу, ничем не менее безопасно чем union-ы. А memcpy ещё и затратно по времени и памяти.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов.
Пример где, как раз, начальные последовательности разные.

И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных.

Согласен что использование union опасно, увеличивает вероятность ошибки. Но альтернативы - reinterpret_cast, сырые указатели, ни чем не лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.11.2024, 22:04

Не так работает Union
Есть функция Union которая вычисляет объединение двух множеств. Значение функции представляет собой список всех выражений, являющихся...

Не работает UNION в SQLite
Добрый день. Есть два стула работающих по отдельности SQL-запроса на выборку: SELECT * FROM t WHERE password='ANY4FvM9n25AsrU262L6' ...

два и более struct в union неправильно работает
#include "stdafx.h" #include<iostream> #include<string.h> using namespace std; struct Matematika { char imya; char...

НЕ работает Union с присоединенными через ODBC dbf-ми
Что за фигня с присоединенными через ODBC foxpro26 DBF таблицами: SELECT * FROM T1 UNION ALL SELECT * FROM T2 Говорит ODBC -...

Как обращаться к Union
Создал указатель на структуру Person в 19 строчке. Как обратиться к полю Union'a? Некорректное обращение к union в 30, 34, 38, 49, 56,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru