Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618

Инициализация структур

11.03.2021, 08:22. Показов 5879. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Я пишу программу для ESP32 и столкнулся с проблемами инициализации. То ли я чего - то не понимаю, то ли там используется какая - то странная помесь С++ и С (то ли лыжи не едут, то ли я недалёкий). Помогите разобраться.

Введение.
В примере создания сервера объявляется структура профилей.
https://github.com/espressif/e... tts_demo.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct gatts_profile_inst {                         // Профиль.
    esp_gatts_cb_t gatts_cb;                        // Обработчик событий.
    uint16_t gatts_if;                              // Интерфейс GATTS.
    uint16_t app_id;                                // ID профиля (типа PROFILE_A_APP_ID).
    uint16_t conn_id;                               // ID соединения.
    uint16_t service_handle;                        // Указатель сервиса.
    esp_gatt_srvc_id_t service_id;                  // ID сервиса, содержит uuid и instance id.
    uint16_t char_handle;                           // Указатель харрактеристики.
    esp_bt_uuid_t char_uuid;                        // uuid характеристики.
    esp_gatt_perm_t perm;                           // Свойства харрактеристики.
    esp_gatt_char_prop_t property;                  // Свойства значения харрактеристики.
    uint16_t descr_handle;                          // Указатель дескриптора.
    esp_bt_uuid_t descr_uuid;                       // UUID дескриптора.
};
Мне этот стиль кода совершенно не нравится, в нём навалено всё в кучу, нет никакого разделения по объектам. Я, конечно, понимаю, что ООП может быть несколько требовательнее к ресурсам, но всё - таки можно же сделать по человечески и ввести хотя бы идеи ООП! Поэтому я хочу его переписать под себя, эмулируя классы структурами.

Для этого я создал три структуры: дескриптора, характеристику и сервис:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct {                                    // Дескриптор.
    uint16_t descr_handle;                          // Указатель дескриптора.
    esp_bt_uuid_t descr_uuid;                           // UUID дескриптора.
} descriptor_handle;
typedef struct {                                    // Харрактеристика.
    uint16_t char_handle;                           // Указатель харрактеристики.
    esp_bt_uuid_t char_uuid;                            // uuid характеристики.
    esp_gatt_perm_t perm;                           // Свойства харрактеристики.
    esp_gatt_char_prop_t property;                      // Свойства значения харрактеристики.
    descriptor_handle* descriptor;                      // Массив дескрипторов.
    uint16_t numOfDescriptors;                      // количество дескрипторов.
} characteristic_handle;
typedef struct {                                    // Сервис.
    uint16_t service_handle;                        // Указатель сервиса.
    esp_gatt_srvc_id_t service_id;                  // ID сервиса, содержит uuid и instance id.
    characteristic_handle* characteristics;             // Массив харрактеристик.
    uint16_t numOfCharacteristics;                  // Количество харрактеристик.
} service_holder;
И немного переписал gatts_profile_inst:

C++
1
2
3
4
5
6
7
8
struct gatts_profile_inst {                         // Профиль.
    esp_gatts_cb_t gatts_cb;                            // Обработчик событий.
    uint16_t gatts_if;                              // Интерфейс GATTS.
    uint16_t app_id;                                // ID профиля (типа PROFILE_A_APP_ID).
    uint16_t conn_id;                               // ID соединения.
    service_holder* services;
    uint16_t numOfServices;                         // Количество сервисов.
};
Первый вопрос: почему обязательно надо указывать typedef (без него компилятор не видит объявления структуры)?

Раньше объявление экземпляра структуры gatts_profile_inst было такое:

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
static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = {
    [PROFILE_A_APP_ID] = {
        .gatts_cb = gatts_profile_a_event_handler,                      // Обработчик событий профиля A.
        .gatts_if = ESP_GATT_IF_NONE,                                   // Начальное значение ESP_GATT_IF_NONE, так как ещё не зарегистрирован ни один профиль.
        .service_id.is_primary = true,                                  // Сервис представляет главный функционал устройства.
        .service_id.id.inst_id = 0x00,                                  // Первый экземпляр сервиса. Может быть несколько сервисов с одним UUID.
        .service_id.id.uuid.len = ESP_UUID_LEN_16,                      // Длина номера UUID сервиса.
        .service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A,    // Номер UUID сервиса.
        .char_uuid.len = ESP_UUID_LEN_16,                               // Записывается длина UUID характеристики.
        .char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_A,                // Записывается UUID характеристики.
        .descr_uuid.len = ESP_UUID_LEN_16,
        .descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,
    },
    [PROFILE_B_APP_ID] = {
        .gatts_cb = gatts_profile_b_event_handler,                      // Обработчик событий профиля B.
        .gatts_if = ESP_GATT_IF_NONE,                                   // Начальное значение ESP_GATT_IF_NONE, так как ещё не зарегистрирован ни один профиль.
        .service_id.is_primary = true,
        .service_id.id.inst_id = 0x00,
        .service_id.id.uuid.len = ESP_UUID_LEN_16,
        .service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_B,
        .char_uuid.len = ESP_UUID_LEN_16,
                .char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_B,
        .descr_uuid.len = ESP_UUID_LEN_16,
        .descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,
    },
};
То есть создаём массив профилей и инициализируем все профили одновременно. Я хочу сделать тоже самое, но с новой структурой.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = {
    [PROFILE_A_APP_ID] = {
        .gatts_cb = gatts_profile_a_event_handler,                      // Обработчик событий профиля A.
        .gatts_if = ESP_GATT_IF_NONE,                                   // Начальное значение ESP_GATT_IF_NONE, так как ещё не зарегистрирован ни один профиль.
        .services[2] = {
                
        };
            
    },
    [PROFILE_B_APP_ID] = {
        .gatts_cb = gatts_profile_b_event_handler,                      // Обработчик событий профиля B.
        .gatts_if = ESP_GATT_IF_NONE,                                   // Начальное значение ESP_GATT_IF_NONE, так как ещё не зарегистрирован ни один профиль.
        .services[2] = {
                
        };
    },
};
То есть теперь в каждом профиле структуры gatts_profile_inst должен быть указатель на массив services из двух элементов, который содержит массив характеристик, который содержит массив дескрипторов.

Второй и главный вопрос: как, собственно инициализировать экземпляр новой структуры gatts_profile_inst? Обязательно надо инициализировать всё в одном месте за один раз, иначе вся переделка не будет иметь смысла.

И инициализировать надо так, чтобы компилятор с линкером перестали ругаться.

Есть идеи?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.03.2021, 08:22
Ответы с готовыми решениями:

Инициализация структур
Не могу уловить по какой причине первый вариант рабочий: А этот нет:

Инициализация структур
Знатоки, что то я не пойму, подскажите: #include <iostream> using namespace std; struct A { int a; }; struct B {

Инициализация массива структур
struct predmet //создаем еще одну структуру, чтобы вложить ее { char *npred; int mark; }; struct student{ char...

32
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618
11.03.2021, 16:02  [ТС]
Студворк — интернет-сервис помощи студентам
DrOffset,
Одно место - один кусочек кода.
Может быть и через функцию, я уже не против. Но лучше, чтобы инициализация выглядела как - то так:


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
InitFunc( profileID1, 
                         service11,
                                     property111,
                                     property112,
                                     property113,
                                     characteristic111,
                                                          charProp1111,
                                                          charProp1112,
                                                          charProp1113,
                                                          descriptor1111,
                                                                          descProp11111,
                                                                          descprop11112,
                                                          descriptor1112,
                                                                          descProp11121,
                                                                          descprop11122,
                                     characteristic112,
                                                          charProp1121,
                                                          charProp1122,
                                                          charProp1123,
                                                          descriptor1121,
                                                                          descProp11211,
                                                                          descprop11212,
                                                          descriptor1122,
                                                                          descProp11221,
                                                                          descprop11222,
                          service12,
                                     property121,
                                     property122,
                                     property123,
                                     characteristic121,
 
// И так далее. **************************************
           profileID2,
                        service21,
// *****************************
                        service22,
// *****************************
)
Согласен, лучше, чтобы в таблице профилей были объекты, а не указатели. Но я не знаю, как это сделать. Могу сказать, что количество характеристик может быть очень разное, но оно точно известно на момент компиляции.

CRTP,
STM или ESP, особой разницы нету. Малое количество памяти - особенность всех микроконтроллеров.

Добавлено через 16 минут
Там у каждой характеристики есть ещё свои свой ствйства и значения, у дескриптора тоже есть значения, я их в примере не указал.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.03.2021, 16:23
Цитата Сообщение от _20_ Посмотреть сообщение
Могу сказать, что количество характеристик может быть очень разное, но оно точно известно на момент компиляции.
Я бы делал подобное на шаблонах. Особенно если есть С++17. Тогда вы точно не получите оверхеда по производительности.

Цитата Сообщение от _20_ Посмотреть сообщение
Но лучше, чтобы инициализация выглядела как - то так:
Я немного не это имел в виду. Инициализация будет внутри функции, а не через ее параметры.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct gatts_profile_inst *  init__gatts_profile_inst() {
    static service_holder service1[2] = {
          //......
    };
    //.............. все остальное
 
    static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = {
        [PROFILE_A_APP_ID] = {
            .gatts_cb = gatts_profile_a_event_handler, 
            .gatts_if = ESP_GATT_IF_NONE,
            .services = service1,
            .numOfServices = 2
        },
    };
    return gl_profile_tab;
}
1
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618
11.03.2021, 16:45  [ТС]
DrOffset,
То есть порядок получается обратный? Сначала я описываю дескрипторы, потом характеристики, включающие эти дескрипторы, потом сервисы, включающие характеристики, потом профили?
Немного неудобно, можно запутаться и не наглядно. Нельзя ли сделать прямой порядок инициализации?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.03.2021, 16:45
Цитата Сообщение от _20_ Посмотреть сообщение
То есть порядок получается обратный? Сначала я описываю дескрипторы, потом характеристики, включающие эти дескрипторы, потом сервисы, включающие характеристики, потом профили?
Если использовать указатели так, как вы написали, то да.
1
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618
11.03.2021, 17:42  [ТС]
DrOffset,
Можете привести пример использования указателей так, чтобы порядок был прямым?

Добавлено через 10 минут
Если есть вариант с шаблонами, то его тоже с удовольствием рассмотрю.

Добавлено через 36 минут
Я сейчас пытаюсь сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    static struct gatts_profile_inst profile_A = {
        .gatts_cb = gatts_profile_a_event_handler,                      // Обработчик событий профиля A.
        .gatts_if = ESP_GATT_IF_NONE,                                   // Начальное значение ESP_GATT_IF_NONE, так как ещё не зарегистрирован ни один профиль.
        .app_id = PROFILE_A_APP_ID,                                     // ID профиля (типа PROFILE_A_APP_ID).
        .numOfServices = 1
        .services[0] = 0
    };
    service_holder profile_A.services[0] = {
        .service_id.is_primary = true,
        .service_id.id.inst_id = 0x00,
        .service_id.id.uuid.len = ESP_UUID_LEN_16,
        .service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A,
        .numOfCharacteristics = 1
    };
Но что - то он меня не понимает. Во - первых говорит, что .services[0] = 0 could not be resolved. И на всю инициализацию service_holder profile_A.services[0] что syntax error.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.03.2021, 18:00
Цитата Сообщение от _20_ Посмотреть сообщение
Можете привести пример использования указателей так, чтобы порядок был прямым?
По вашей задаче это сделать невозможно. Вы сами задали такой порядок тем, что одна структура у вас включает указатели на вторую. Таким образом у вас для нормальной работы объекта первой структуры, объект второй уже должен быть создан. Иначе как вы инициализируете указатель?

Добавлено через 16 секунд
Цитата Сообщение от _20_ Посмотреть сообщение
Если есть вариант с шаблонами, то его тоже с удовольствием рассмотрю.
Будет время - сделаю.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
11.03.2021, 19:50
Лучший ответ Сообщение было отмечено _20_ как решение

Решение

Цитата Сообщение от _20_ Посмотреть сообщение
Я на форуме микроконтроллера спрашивал, можно ли использовать фишки С++, так они мне С++17 обещали. А на деле компилятор на объявление без typedef ругается. Поэтому не думаю, чтоб там деструкторы поддерживались, но можно попробовать.
"На объявление без typedef ругается" потому, что вы компилируете ваш код, как язык С. Вы выбрали язык С и пользуетесь языком С. Какая разница, что там вам "обещали" в плане языка С++, если вы пользуетесь С, а не С++? И почему вы задаете эти вопросы в форуме по С++?

Цитата Сообщение от _20_ Посмотреть сообщение
Так как мне определить вложенный массив services[]?
У вас нет "вложенного массива services", у вас есть вложенный указатель на начало массива services. Такой массив можно определить "на месте" при помощи compound literals. Однако это тоже фича языка С. Например

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
typedef struct Service
{
  int a, b, c;
} Service;
 
typedef struct Instance
{
  int n;
  Service *services;
} Instance;
 
int main()
{
  Instance instances[5] = 
  {
    [2] = 
    {
      .n = 3,
      .services = (Service [3])
      {
        { .a = 1, .b = 2, .c = 3 },
        { .a = 4, .b = 5, .c = 6 },
        { .a = 7, .b = 8, .c = 9 },
      }
    },
    [4] = 
    {
      .n = 1,
      .services = (Service [1])
      {
        { .a = 1, .b = 2, .c = 3 }
      }
    }
  };
}
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.03.2021, 21:35
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Такой массив можно определить "на месте" при помощи compound literals.
А время жизни этого массива разве будет продлеваться? Мы не получим "висячий" указатель здесь?
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
11.03.2021, 21:41
Цитата Сообщение от DrOffset Посмотреть сообщение
А время жизни этого массива разве будет продлеваться? Мы не получим "висячий" указатель здесь?
Я исхожу из того, что мы говорим о С. В С compound literal - это не временный объект, это объект с обычным временем жизни, определяемым тем, где этот compound literal располагается. Внутри локального блока мы получаем обычный автоматический объект для этого блока. За пределами функции мы получаем обычный статический объект.
2
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
11.03.2021, 21:51
TheCalligrapher, спасибо, честно говоря я не знал об этом.

_____

Ну тогда автору проще всего ничего не выдумывать, а воспользоваться этой фичей для своего проекта. Даже если у него проект на С++, то определение и инициализацию можно сделать в одном файле компилируемом как С и все. Вынесет объявление этих массивов в соответствующий заголовочный файл и подключит в остальные части проекта на C++.
1
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618
11.03.2021, 23:14  [ТС]
TheCalligrapher,
Мне очень нравится Ваше предложение. Именно то, что я хотел.

Я поработаю ещё над внешним видом, пока это выглядит так:


C++
1
2
3
4
5
6
7
8
9
typedef struct gatts_profile_inst {                         // Профиль.
        esp_gatts_cb_t gatts_cb;                        // Обработчик событий.
        uint16_t gatts_if;                              // Интерфейс GATTS.
        uint16_t app_id;                                // ID профиля (типа PROFILE_A_APP_ID).
        uint16_t conn_id;                               // ID соединения.
 
        service_holder* services;
        uint16_t numOfServices;                 // Количество сервисов.
    }gatts_profile_inst;
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
struct gatts_profile_inst profiles[PROFILE_NUM] = {
    [PROFILE_A_APP_ID] = {
        .gatts_cb = gatts_profile_a_event_handler,                      // Обработчик событий профиля A.
        .gatts_if = ESP_GATT_IF_NONE,                                   // Начальное значение ESP_GATT_IF_NONE, так как ещё не зарегистрирован ни один профиль.
        .app_id = PROFILE_A_APP_ID,                                     // ID профиля (типа PROFILE_A_APP_ID).
        .numOfServices = 1
        .services = (service_holder[1]){
            {
                .service_id.is_primary = true,
                .service_id.id.inst_id = 0x00,
                .service_id.id.uuid.len = ESP_UUID_LEN_16,
                .service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A,
                .numOfCharacteristics = 1
                .characteristics = (characteristic_handle[1]){
                    {
                        .char_uuid.len = ESP_UUID_LEN_16,                               // uuid характеристики.
                        .char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_A,
                        .numOfDescriptors = 1                                           // количество дескрипторов.
                        .descriptor = (descriptor_handle[1]){
                            {
                                .descr_uuid.len = ESP_UUID_LEN_16,
                                .descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG
                            }
                        }
                    }
                }
            }
        }
    },
    [PROFILE_B_APP_ID] = {
        .gatts_cb = gatts_profile_b_event_handler,                      // Обработчик событий профиля A.
        .gatts_if = ESP_GATT_IF_NONE,                                   // Начальное значение ESP_GATT_IF_NONE, так как ещё не зарегистрирован ни один профиль.
        .app_id = PROFILE_B_APP_ID,                                     // ID профиля (типа PROFILE_A_APP_ID).
        .numOfServices = 1
        .services = (service_holder[1]){
            {
                .service_id.is_primary = true,
                .service_id.id.inst_id = 0x00,
                .service_id.id.uuid.len = ESP_UUID_LEN_16,
                .service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A,
                .numOfCharacteristics = 1
                .characteristics = (characteristic_handle[1]){
                    {
                        .char_uuid.len = ESP_UUID_LEN_16,                               // uuid характеристики.
                        .char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_A,
                        .numOfDescriptors = 1                                           // количество дескрипторов.
                        .descriptor = (descriptor_handle[1]){
                            {
                                .descr_uuid.len = ESP_UUID_LEN_16,
                                .descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG
                            }
                        }
                    }
                }
            }
        }
    }
};
Но почему - то компилятор подчёркивает все указатели, например services:
C++
1
.services = (service_holder[1]){
, с ошибкой "request for member 'services' in something not a structure or union".

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef struct {                                    // Дескриптор.
    uint16_t descr_handle;                          // Указатель дескриптора.
    esp_bt_uuid_t descr_uuid;                       // UUID дескриптора.
} descriptor_handle;
typedef struct {                                    // Харрактеристика.
    uint16_t char_handle;                           // Указатель харрактеристики.
    esp_bt_uuid_t char_uuid;                        // uuid характеристики.
    esp_gatt_perm_t perm;                           // Свойства харрактеристики.
    esp_gatt_char_prop_t property;                  // Свойства значения харрактеристики.
    descriptor_handle* descriptor;                  // Массив дескрипторов.
    uint16_t numOfDescriptors;                      // количество дескрипторов.
} characteristic_handle;
typedef struct {                                    // Сервис.
    uint16_t service_handle;                        // Указатель сервиса.
    esp_gatt_srvc_id_t service_id;                  // ID сервиса, содержит uuid и instance id.
    characteristic_handle* characteristics;         // Массив харрактеристик.
    uint16_t numOfCharacteristics;                  // Количество харрактеристик.
} service_holder;
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
11.03.2021, 23:14
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

Так а запятая в конце предыдущей строчки почему отсутствует? Причем везде упорно повторяется одна и та же ошибка.
1
22 / 56 / 9
Регистрация: 29.09.2011
Сообщений: 618
12.03.2021, 01:12  [ТС]
TheCalligrapher,
Большое спасибо. Всё компилируется, прошивается и работает так же, как и раньше. То, что надо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2021, 01:12

Инициализация вложенных структур
#include <iostream> using namespace std; int main() { struct one { int var1; int var2; };

Инициализация вектора структур
Не могу инициализировать вектор. struct cmd{ QString name; qint16 code; }; QVector <cmd> commands={ ...

Инициализация массива структур
Почему после инициализации первого массива программа выходит из цикла ? как сделать чтобы инициализировала все 3 объекта структуры ...

Инициализация массива структур из файла
Здравствуйте,при реализации программы столкнулся с такой проблемой: нужно из файла,где записанный студенты их имена.. возраст...пол и т.д ,...

Инициализация структур, с большим количеством полей
Здравствуйте, такой вопрос: кто как инициализирует структуры? И как вам такая функция для инициализации: template < typename T...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru