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

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

01.11.2024, 15:47. Показов 5719. Ответов 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
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
01.11.2024, 22:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Curry Посмотреть сообщение
Использовать для реинтерпретации memcpy, да даже и приведение типа указателей к другому типу, ничем не менее безопасно чем union-ы. .
Вы о чем вообще?

При чем здесь "безопасно", если в С++ union НЕ может быть использован для реинтерпретации памяти? Такой функциональности у union нет в принципе и никогда не было.

К чему вы привели здесь "приведение типа указателей"? "Приведение типа указателей" НЕ может быть использовано для реинтерпретации памяти вообще нигде - ни в С, ни в С++ (кроме исключения, сделанного для char).

Нет такой функциональности в С++. В С++ для реинтерпретации памяти есть только std::memcpy, std::bit_cast и приведение к char *.

Цитата Сообщение от Curry Посмотреть сообщение
А memcpy ещё и затратно по времени и памяти.
Феерия крепчает прямо на глазах... Это с чего бы это вдруг? Наоборот: memcpy - стандартная, функция, то есть самый оптимальный вариант и по времени, и по памяти.

Цитата Сообщение от Curry Посмотреть сообщение
Пример где, как раз, начальные последовательности разные.

И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных.
О чем речь вообще? Покажите мне пальцем, где вы по этой ссылке увидели доступ к неактивному члену union или даже какой-то намек на него?
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 22:20
Цитата Сообщение от Curry Посмотреть сообщение
А memcpy ещё и затратно по времени и памяти.
Не-а.
memcpy - это интринсик. И для статических размеров он выраждается в обычный доступ, только оптимизации алиасинга предупреждены.

Цитата Сообщение от Curry Посмотреть сообщение
Пример где, как раз, начальные последовательности разные.
И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных.
Это Сишные структуры. Win API оно ж на Си, никакого алиасинга на стороне библиотеки, которая поставляет этот заголовок, естественно не будет. Библиотека на Си.
А в начале темы было сказано, что на Си так можно делать.

Цитата Сообщение от Curry Посмотреть сообщение
Но альтернативы - reinterpret_cast, сырые указатели, ни чем не лучше.
В современном Си++ есть bit_cast и он лучше.

А reinterpret_cast - для type punning - это никакая не альтернатива, а точно такой же некорректный код.

Читайте уже ссылку выше, хватить поддерживать безграмотность!
2
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
02.11.2024, 06:55
Verevkin, можно верить, а можно не верить в UB. Но в стандарте про это написано, а разработчики компиляторов (лично слышал от одного из них) прямо говорят - оно существует
Выражается это так: сегодня твоя программа работает вроде правильно и кормит тебя. А завтра чуть поменяешь настройки компилятора или обновишь версию/стандарт. Пересобирёшь программу, и там всё станет работать чуточку иначе. Непредсказуемо.

Цитата Сообщение от Curry Посмотреть сообщение
А memcpy ещё и затратно по времени и памяти.
нет, не затратно. Внутри (даже без оптимизации) компилятор не будет вызывать функцию, он сделает прямо вот так: A a=*((A*)&b);, только при этом не будет UB (если, конечно, это POD типы). А человеку так нельзя
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
02.11.2024, 07:20
с оптимизацией -O0

https://godbolt.org/z/jd5a69694



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
#include <iostream>
#include <cstring>
#include <type_traits>
 
struct A
{
    unsigned long int i{};
};
 
struct B
{
    double d{11.22};
};
 
int main()
{
    A a;
    B b;
    
    //так делать нельзя!
    a=*((A*)&b);
    std::cout<<a.i<<'\n';
 
    //а так можно
    static_assert(sizeof a == sizeof b);
    static_assert(std::is_trivially_copyable_v<A>);
    static_assert(std::is_trivially_copyable_v<B>);
    static_assert(std::is_standard_layout_v<A>);
    static_assert(std::is_standard_layout_v<B>);
    std::memcpy(&a, &b, sizeof a);
    std::cout<<a.i<<'\n';
}
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 10:24
Цитата Сообщение от Verevkin Посмотреть сообщение
то я ума не разложу, зачем так сделано? Чтобы было неудобно? Получается, что поля каким-то волшебным образом имеют разное время жизни, которое заранее неизвестно. Зачем?
Чтобы оптимизатор творил всякую дичь.

Фантазийный пример (я не знаю как тут будет на самом деле в данном случае, но почему бы оптимизатору не поступить именно так?)

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
union myunion
{
   int a;
   char b;  
};
 
 
int main()
{
    myunion unn;
    unn.a = 6;
    unn.b = 'Z';
    
    //выше мы полю unn.b присвоили константу и далее это поле не используем -
    //тогда ничего не мешает компилятору тут просто вызвать метод с константным параметром 'Z',
    //а в поле unn.b вообще ничего не записывать выше, зачем? всё равно оно ниже не используется
    cout<< "unn.b =  " << unn.b;
 
    //последний раз присваивали значение полю unn.b, а обращаемся к unn.a, что есть UB
    //сильно умный оптимизатор тут вообще может вставить вызов метода с любым случайным константным значением,
    //это ж всё равно UB, можно выводить что хочешь;
    //можно даже в unn.a выше не присваивать 6, т.к. ниже оно не используется
    cout<< "unn.a  =  " << unn.a;
}
Такая вот нынче дикая логика у оптимизаторов...

Причем наверняка можно придумать такую архитектуру (а может таковая даже есть?), где и без оптимизатора вот это вот "наложение байтов в памяти для union", как это было придумано в Си и как это фактически реализовывают в С++ компиляторах на x86 сейчас, фактически будет просто невозможным.
Но у меня не хватает фантазии такое придумать.

PS
Ну вот так мир устроен... какой-то особой глубокой логики в этом нет кроме желания бешенной универсальности от языка не зависимо от платформы. Остаётся лишь принять по стандартной схеме:
1. Отрицание · 2. Злость · 3. Торг · 4. Депрессия · 5. Принятие.
1
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
02.11.2024, 12:00
Интересная тема....
А реальная польза?
Примерчик бы кто привёл...
0
 Аватар для sporta1982
215 / 61 / 7
Регистрация: 05.10.2023
Сообщений: 538
02.11.2024, 12:04

Не по теме:


https://habr.com/ru/articles/740056/

Тема неопределённого поведения — большая. Людей, которые очень хорошо понимают все связанные с ним аспекты — в мире достаточно немного. Примеров, как оно может проявляться и использоваться компилятором — десятки.


0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
02.11.2024, 12:16
Всё говорит о том, что бы с union не связываться?
https://ru.stack....flow.com/q... 0%B5-union
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,656
Записей в блоге: 9
02.11.2024, 12:23
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в С++ union НЕ может быть использован для реинтерпретации памяти
На практике он широко для этого используется. Я не буду для доказательства собирать 100500 ссылок на опубликованные коды.
Приведу решённую мной реальную задачу.
Во входном потоке поступают данные в виде разных struct следующих одна за другой. На самом деле существует дополнительная информация для определения границ и типов структур, но для меня она потеряна. Однако имеется возможность угадывать тип структуры по содержимому.
Я сочинил "не могущий быть использованным" юнит
C++
1
2
3
4
5
union SlidingWindow{
   struct1 s1;
   struct2 s2;
   unsigned char bytes[1];
};
Скольжу им вдоль данных и определяю где какая структура, затем извлекаю нужные данные из юниона. Это работает.
А теперь объясните почему я должен реализацию переделать на безюнионную, использовать bit_cast или чтото ещё?
Чем это плохо по сравнению с [указать другой вариант]?
Никакого UB у меня там нет.


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
memcpy - стандартная, функция, то есть самый оптимальный вариант и по времени, и по памяти.
В варианте с union не нужно создавать ещё одну переменную и данные туда копировать, можно данные использовать по месту, сразу в юнионе.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Покажите мне пальцем, где вы по этой ссылке увидели доступ к неактивному члену union
Я не про "неактивный член", а про ваше высказывание
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов.
А насчёт активного члена, то, если компилятор этот "активный член" не контролирует, то нечего про него и говорить.
Есть языки в которых тип может иметь разное содержимое, и какое оно контролируется в компайл и ран-таймах, но там в типе хранится ещё и код варианта, в С++, насколько я в курсе, такие типы пока не завезли, да и неудобны они для реинтерпретации. Но там то можно было бы говорить про "активный член" хотя используют другие термины. А в С++ "активный член" можно обсуждать только как рекомендацию в разработке, не обязательную, кто бы что не говорил.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Выражается это так: сегодня твоя программа работает вроде правильно и кормит тебя. А завтра чуть поменяешь настройки компилятора или обновишь версию/стандарт. Пересобирёшь программу, и там всё станет работать чуточку иначе. Непредсказуемо.
Может быть не нужно обобщать на все случаи использования union?

Цитата Сообщение от Алексей1153 Посмотреть сообщение
с оптимизацией -O0
Вот они лишние 2 машинные команды и лишняя переменная. А в случае union можем работать с данными прямо в union.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 12:25
Цитата Сообщение от Наталья8 Посмотреть сообщение
что бы с union не связываться?
Зависит от целей.
Для "реинтерпретации памяти" - в С++ нелья, ибо UB. В Си можно.
Для задач экономии памяти, когда разработчик очень внимательно следит за руками и очень в этих руках уверен - сколько угодно.
1
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
02.11.2024, 12:26

Тоже пишут что то похожее. (Покорректнее правда.)
А как если у меня на компиляторе и си и с++ включено.?..
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 12:30
Цитата Сообщение от Наталья8 Посмотреть сообщение
если у меня на компиляторе и си и с++ включено.?
Чего? можно расшифровать?
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
02.11.2024, 12:32
Я пишу на смеси си и си++.
Принимает и то и другое.
Где то в настройках наверное можно переключиться на чистое си.
Я пишу вот так...
msvc2015
Понял - UB.. Ну и ладушки...
(Не пользовал я union ни разу...)
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 12:41
Цитата Сообщение от Наталья8 Посмотреть сообщение
Я пишу на смеси си и си++.
Принимает и то и другое.
То, что компилируется компилятором C++ - это по правилам С++
То, что компилируется компилятором Си - работает по правилам Си.

Вы разные части программы реально компилируете компиляторами с разными настройками? чета я сомневаюсь.
Наверняка же всё С++ компилятором комплируете и не заморачиваетесь.

А то, что сама параграмма при этом не выходит за рамки синтаксиса Си - так это не важно абсолютно.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
02.11.2024, 12:49
Как можно писать на Си в Visual Studio 2015?
Есть такое...

Добавлено через 2 минуты
Цитата Сообщение от KSergey9 Посмотреть сообщение
Наверняка же всё С++ компилятором комплируете
Ну да...
printf() - это си.
std printf() - это плюсы.
Очень просто.
И так всё до кучи...
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
02.11.2024, 13:21
Цитата Сообщение от Curry Посмотреть сообщение
Скольжу им вдоль данных и определяю где какая структура
это нарушение strict aliasing
Точно так же можно скользить указателем const char*, а вот его уже можно кастить к другому указателю, который можно разыменовать (если в указуемом месте достаточно памяти для размещения целевого типа).
После этого данные копируются std::memcpy

Цитата Сообщение от Curry Посмотреть сообщение
Может быть не нужно обобщать на все случаи использования union?
так я только про реинтерпретацию, а не про все случаи

Цитата Сообщение от Curry Посмотреть сообщение
Вот они лишние 2 машинные команды и лишняя переменная
не очень понял данный комментарий.
Видно, что как раз при "запрещённом" действии три ассемблерные инструкции, а для std::memcpy - две.
Но по содержимому видно, что делается то же самое, только в первом случае компилятор сначала в rax засунул адрес

Опять же, тут отключена оптимизация, поэтому, что будет в реальности - нужно смотреть с оптимизацией. В данном же случае я просто показал, что нет вызова функции даже без оптимизации, это обеспечивается стандартом

Добавлено через 2 минуты
Цитата Сообщение от KSergey9 Посмотреть сообщение
разные части программы реально компилируете компиляторами с разными настройками? чета я сомневаюсь.
в студии по умолчанию так и настроено - ЕТ *.c отдаются компилятору C , а *.cpp - компилятору C++
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,656
Записей в блоге: 9
02.11.2024, 14:48
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это нарушение strict aliasing
К чему плохому описанный мной способ приведёт? К нарушению защиты памяти? К извлечению неверных данных?
Нет, не приводит.
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Точно так же можно скользить указателем const char*, а вот его уже можно кастить к другому указателю
И чем это лучше? Только кода больше.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
не очень понял данный комментарий.
Я сравниваю memcpy не с операцией присваивания, а с использованием данных прямо в union, они там уже есть, в члене юниона нужного типа. Кому хочется, может теперь считать его активным. В этом случае вообще нет копирования.
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
02.11.2024, 15:04
Цитата Сообщение от Curry Посмотреть сообщение
К чему плохому описанный мной способ приведёт
это приведёт к наличию UB в программе. Если не страшно - на здоровье Но это действительно на свой страх и риск.

Цитата Сообщение от Curry Посмотреть сообщение
И чем это лучше
это лучше тем, что UB отсутствует
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,656
Записей в блоге: 9
02.11.2024, 15:50
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это приведёт к наличию UB в программе.
С чего бы?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
02.11.2024, 18:58
Цитата Сообщение от Curry Посмотреть сообщение
На практике он широко для этого используется. Я не буду для доказательства собирать 100500 ссылок на опубликованные коды.
Нет, конечно. Никогда и нигде это не используется. Я бы мог вам долго рассказывать про "100500 уличных овнокодеров", которые по причине некомпетентности могу лабать подобный трэшак, но на само деле это не нужно.

Тут все намного проще: как только в коде появляется такое использование union, этот код уже автоматически не является С++. Это может быть "Вася++ 2.0", это "мегаязык коляна из третьего подъезда" и т.п. замечательные эзотерические языки программирования. Но это не С++.

А здесь - форум по С++.

Цитата Сообщение от Curry Посмотреть сообщение
Приведу решённую мной реальную задачу.
Во входном потоке поступают данные в виде разных struct следующих одна за другой. На самом деле существует дополнительная информация для определения границ и типов структур, но для меня она потеряна. Однако имеется возможность угадывать тип структуры по содержимому.
Я сочинил "не могущий быть использованным" юнит
C++
1
2
3
4
5
union SlidingWindow{
   struct1 s1;
   struct2 s2;
   unsigned char bytes[1];
};
Скольжу им вдоль данных и определяю где какая структура, затем извлекаю нужные данные из юниона. Это работает.
А теперь объясните почему я должен реализацию переделать на безюнионную, использовать bit_cast или чтото ещё?
Чем это плохо по сравнению с [указать другой вариант]?
Никакого UB у меня там нет.
Вы снова, как в случае с ссылкой на сайт MS, стыдливо не привели собственно кода, который работатет c union, а ограничились "словесным описанием". То есть опять совершенно непонятно, о чем вы ведете речь.

Однако что мой дар предвидения мне подсказывает по этому словесному описанию, что вы действительно там "наовнокодили".

Цитата Сообщение от Curry Посмотреть сообщение
Никакого UB у меня там нет.
Вот именно такие заявления свидетельствуют о полной некомпетентности говорящего. О каком "никакого UB у меня там нет", если спецификация языка говорит, что есть? Смех, да и только...

Цитата Сообщение от Curry Посмотреть сообщение
В варианте с union не нужно создавать ещё одну переменную и данные туда копировать, можно данные использовать по месту, сразу в юнионе.
Вот именно для таких ситуаций в членах union делается общая начальная подпоследовательность, которую можно инспектировать для определения фактического состояния (т.е. активного члена) union. Имено для этого она упоминается в спецификации языка. То есть вашу функциональность не обязательно было "овнокодить". Ее можно было сделать правильно.

С, этого, кстати, и начинается банальная компетентность в программирования: со знания того, что как то же самое можно сделать без "овнокодинга".

Цитата Сообщение от Curry Посмотреть сообщение
Я не про "неактивный член", а про ваше высказывание
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов. Вот эти общие начальные последовательности можно просматривать, игнорируя соображения текущего активного члена.
Опять не пойму: вы о чем вообще??? Все мои высказывания до сих пор были посвящены теме активного/неактивного члена union. Это высказывание тоже (я специально процитировал его полнее и выделил жирненьким) - именно об этом. Вся тема этому посвящена.

Цитата Сообщение от Curry Посмотреть сообщение
А насчёт активного члена, то, если компилятор этот "активный член" не контролирует, то нечего про него и говорить...
Вам нужно начать изучать основы языка, чтобы вот такого ^^^ в голове не было. Пока что ни о каком программировании на С или С++ с вашей стороны речи идти не может ни в какой форме. Пока не возникло в голове понимания того, что такое UB, все будет вот так вот плохенько...

---

Также в #41 я задал вопрос по поводу вашего:

Цитата Сообщение от Curry Посмотреть сообщение
Пример где, как раз, начальные последовательности разные.

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

О каком "MS неправильные" вы ведет речь? Где вы увидели связь вашей ссылки с темой? Что мы должны были увидеть там? Это не риторический вопрос, я хочу видеть подробный ответ.

В сообщении #49 вы снова вывалили сюда пример уже некоего своего union, объявление которого само по себе совершенно ни о чем не говорит, и снова не видно никакого объяснения. Опять непонятно, что вы этим хотели сказать. Что это было???

Вы флудлите форум тоннами какого-то левого текста и ссылками, которые не имеет никакого отношения к теме. Каждый такой флуд вам придется подробно объяснять. Начнем с ссылки на сайт MS. Итак?

(И еще раз: если мой вопрос явно не помечен как риторический, ответ обязателен. Игнорировать заданные мнюю вопросы здесь не принято.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2024, 18:58

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

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

два и более struct в union неправильно работает
#include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;string.h&gt; 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,...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru