Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 87

Модификатор const для переменных и функций C++

15.02.2021, 14:30. Показов 3129. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня есть такая программа.
.h
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
#pragma once
#include <iostream>
#include <string>
 
using namespace std;
 
class Ship
{
private:
    string name;
    string m_val;
    string valueName;
    string type;
    string t_val;
    string valueType;
    int displacement;
    int d_val;
    int valueDisplacement;
 
public:
 
    Ship(const string valueName, int valueDisplacement, const string valueType);
        
    Ship() : m_val{}, d_val{}, t_val{} {} // конструктор по умолчанию
 
    
 
    //NAME
    const string get_Name() const;
    void set_Name(const string valueName);
 
    //displacement
    const int get_Displacement() const; 
    void set_Displacement(const int valueDisplacement);
 
    //type
    const string get_Type() const;
    void set_Type(const string valueType);
 
 
    void Print() const; // функция вывода данных на экран
 
    void Input(); // функция ввода данных с клавиатуры
};
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#define _CRT_SECURE_NO_WARNINGS
 
#include <cstdlib>
#include "main.h"
#include <Windows.h>// чтобы работала функция SetConsole
 
using namespace std;
 
 
Ship::Ship (const string valueName, int valueDisplacement, const string valueType) //конструктор с параметрами
    //: m_val{}, d_val {}, t_val{}
{
    set_Name(valueName);
    set_Displacement(valueDisplacement);
    set_Type(valueType);
}
//NAME
const string Ship::get_Name() const
{
        return m_val;
}
 
void Ship:: set_Name(const string valueName)
{
    string s = "#,&"; //введем условие, чтобы в названии не использовали символы # и &, например
    for (auto const & r : s)
 
        if (valueName.find(r) != string::npos)
            cerr << "Неверно указано наименование судна" << endl;
        else
            m_val = valueName;
 
}
 
//displacement
const int Ship::get_Displacement() const
{
    return d_val;
}
 
void Ship::set_Displacement(const int valueDisplacement)
{
    if (valueDisplacement > 1000 && valueDisplacement < 1000000)
        d_val= valueDisplacement;
 
    else
        cerr << "Неверно указана величина водоизмещения" << endl;
}
 
//type
const string Ship::get_Type() const
{
    return t_val;
}
 
void Ship::set_Type(const string valueType)
{
    string s = "#,&";
    for (auto const & r : s)
 
        if (valueType.find(r) != string::npos)
            cerr << "Неверно указан тип судна" << endl;
        else
    t_val= valueType;
}
 
 
void Ship::Print() const // функция вывода данных на экран
{
    cout << "\nНаименование\t" << get_Name()  << "\nВодоизмещение\t" << get_Displacement() << "\nТип\t\t" << get_Type() << endl;
}
 
 
void Ship::Input() // функция ввода данных с клавиатуры
{
    cout << "\nВведите наименование корабля и нажмите Enter\t" << endl; //выводим сообщение пользователю о вводимых данных
    cin >> valueName;
    Ship ::set_Name(valueName);
    cout << "\nВведите Водоизмещение корабля и нажмите Enter\t";  //выводим сообщение пользователю о вводимых данных
    cin >> valueDisplacement;
    Ship::set_Displacement(valueDisplacement);
    cout << "\nВведите Тип корабля и нажмите Enter\t"; //выводим сообщение пользователю о вводимых данных
    cin >> valueType;
    Ship::set_Type(valueType);
}
 
int main()
{
    setlocale(LC_CTYPE, "rus"); SetConsoleCP(1251); SetConsoleOutputCP(1251); // для вывода информации на русском языке
    Ship firstship("Титаник", 52310, "пассажирский");
    firstship.Print(); // выводим данные на экран
 
    //const Ship *Ship1;
    Ship *Ship1;
    const string name2 = "Аврора";
    const string name3 = "крейсер";
    Ship1 = new  Ship(name2, 6731, name3) ; // создание объекта,  вызов конструктора с тремя параметрами
    Ship1-> Print(); // выводим данные на экран
    delete Ship1; // освобождаем память
 
    Ship Ship2;//создание объекта,  используется конструктор без параметров
    
    Ship2.Input();
    Ship2.Print();
 
    system("pause"); // задайте ожидание (паузу) перед выходом из программы
 
    return 0;
}
Преподаватель указал на то, что необходимо использовать модификатор const для переменных и функций, для которых это имеет смысл. Я его вставила в геттеры,т.к. читала, что они всегда используются с const . И в функцию вывода.
Но еще ему не нравится фрагмент
C++
1
2
const string name2 = "Аврора";
Ship1 = new Ship(name2, 6731, "крейсер"); // создание объекта,  вызов конструктора с тремя параметрами.

Посмотрите пожалуйста, может я чего лишего понаставила или наоборот чего не хватает.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2021, 14:30
Ответы с готовыми решениями:

Использвать модификатор const для переменных и функций, для которых это имеет смысл
Здравствуйте, форумчане! Подскажите, пожалуйста, что не так в следующем коде. С удовольствием разобрался бы сам, но горят сроки...

Модификатор const в аргументах функций
Постоянно путаюсь в этих константах. Как писать грамотнее? Вот так: template&lt;typename TypeT&gt; void...

Модификатор const для параметра функции не const?
void foo(const int N) { int Arr; //&lt;-- ??? } В clang это работает. В VisualStudio 2015 нет.

40
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.02.2021, 02:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Второй пример постоянно дергает память (отметил стрелочкой разницу).
Тут согласен, это близко к
Цитата Сообщение от IGPIGP Посмотреть сообщение
брать во внимание примитивные типы
то есть при очень маленьком размере - сопоставимом с размером указателя, ссылка проигрывает копированию. А вот
Цитата Сообщение от DrOffset Посмотреть сообщение
даже константная ссылка не может гарантировать, что значение объекта не изменится косвенным образом в другом контексте
Это о том, чтобы злонамеренно использовать приведение? Компилятор же будет возмущаться, если явно скастить? Или вы о другом?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,307
16.02.2021, 04:04
Цитата Сообщение от _stanislav Посмотреть сообщение
это как верхнего уровня? а нижнего уровня бывает?
C++
1
2
3
4
5
6
7
8
9
10
11
int ******const p = 0;
//        ^^^^^
//        верхнего уровня
 
int const ******q = 0;
//  ^^^^^
//  нижнего уровня
 
int ***const ***r = 0;
//     ^^^^^
//     среднего уровня
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
16.02.2021, 06:42
IGPIGP, есть хорошая статья в книге "Шаблоны C++. Справочник разработчика | Джосаттис Николаи М., Грегор Дуглас" Глава 7. По значению или по ссылке?

...
За сценой передача аргумента по ссылке осуществляется с помощью пере­
дачи адреса аргумента. Адреса кодируются компактно, так что передача адреса
из вызывающей функции в вызываемую сама по себе эффективна. Однако при
передаче адреса для компилятора создается некоторая неопределенность: что
вызываемая функция делает с этим адресом? В теории вызываемый код может
изменять все значения, до которых удается “добраться” с использованием этого
адреса. Это означает, что компилятор должен считать, что все значения, которые
он может кешировать (обычно в регистрах процессора), после вызова являются
недействительными. Перезагрузка всех этих значений может оказаться довольно
дорогой. Вы можете возразить, что мы передаем константную ссылку: не может
ли компилятор на этом основании определить, что никакие изменения не могут
произойти? К сожалению, это не так, потому что вызывающий код может изме­
нить объект через свою собственную, не константную ссылку.
Эти плохие новости смягчаются применением встраивания: если компилятор мо­
жет развернуть вызов как встроенный, он может увидеть вызывающий и вызывае­
мый код вместе и во многих случаях “понять”, что адрес не используется ни для чего,
кроме передачи указываемого им значения. Шаблоны функций часто очень корот­
кие и потому являются вероятными кандидатами для встраивания. Однако, если
шаблон инкапсулирует более сложный алгоритм, встраивание вряд ли произойдет.
(Еще одним, более явным способом изменения объекта является применение const_cast.)
...


Добавлено через 16 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
среднего уровня
не понятно только средний уровень как использовать?
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.02.2021, 08:34
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это о том, чтобы злонамеренно использовать приведение?
Нет. Это о том, что само по себе наличие const-ссылки никак не гарантирует, что в другом контексте, может быть даже в этом же самом, но через другой экземпляр, не будет возможности изменения объекта.
Например
C++
1
2
3
4
5
6
7
8
9
10
void foo(const A & cr, A & r)
{
   //....
}
 
int main()
{
    A a;
    foo(a, a);
}
Внутри функции в общем случае никак нельзя узнать, ссылаются ли обе ссылки на один и тот же объект или нет. Поэтому компилятор будет исходить из предположения, что да - могут ссылаться. В принципе частично эту ситуацию могло бы разрешить ключевое слово restrict, которое есть в С, а в С++ многие его давно просят. Но в общем случае проблема все равно останется. См. ниже.
Это был простой пример, но может быть и более изощренный вариант, например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A a;
 
void  somefunc()
{
    a = ....;
}
 
void foo(const A & cr)
{
    cr.f1(); // здесь одно состояние
    somefunc(); // меняет исходный объект
    cr.f2(); // здесь уже другое состояние
}
 
// где-то в другом месте
{
    foo(a);
}
Вот из-за таких ситуаций в общем случае компилятор не может себе позволить "закешировать" внутри функции (в регистрах или еще как) значения из объекта по константной ссылке, и вынужден постоянно обращаться к ним через косвенную адресацию.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.02.2021, 10:59
Цитата Сообщение от DrOffset Посмотреть сообщение
но может быть и более изощренный вариант, например так:
Это грустно, если somefunc(); имеет доступ к переменной не получив её как параметр. Разве-что если это колбэк с вызывающей стороны. Но в и этом случае, возможно это то, чего желает программист... В принципе, убедили, - может кому-то и понравится и пригодится. Но это уж точно не тот случай, когда нужно скрыть от пользователя, в реализации, константность объявленного параметра. Тут как раз полезно показать ведь?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.02.2021, 11:06
IGPIGP, константность передаваемого по значению параметра в определении функции - это, так сказать, фича самодокументирующегося кода. Т.е. дополнительный визуальный и автоматизированный контроль корректности. С другой стороны - пользователю функции эта информация не нужна (какая ему разница контролирует ли функция в своей реализации неизменность параметра или нет?), поэтому, чтобы его не удивлять, из объявления можно const убрать.
Но, справедливости ради, на практике я очень редко такой подход наблюдал.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
16.02.2021, 11:10
Цитата Сообщение от DrOffset Посмотреть сообщение
Но, справедливости ради, на практике я очень редко такой подход наблюдал.
какой такой?

Добавлено через 3 минуты
и какая практика чаще наблюдается?, если аргумент по значению передается.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.02.2021, 11:12
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это грустно, если somefunc(); имеет доступ к переменной не получив её как параметр. Разве-что если это колбэк с вызывающей стороны. Но в и этом случае, возможно это то, чего желает программист... В принципе, убедили, - может кому-то и понравится и пригодится.
Просто еще раз повторю тезисно:
1) Ссылку можно использовать, когда накладные расходы от косвенной адресации не важны или отсутствуют (например при встраивании функции их не будет)
2) По значению можно передавать когда
а) Мы точно знаем, что будет лучше или по крайней мере не хуже по объему передаваемых данных (см, например, спецификацию x64 ABI, и правила передачи параметров через регистры)
б) Нам по каким-то причинам важно избегать косвенной адресации даже в ущерб накладному копированию (например функция работает долго, постоянно обращается к данным, а копирование можно сделать один раз при вызове, т.е. не смотря на дорогое копирование, его влияние минимально за счет того, что выполняется оно один раз).

Точный ответ, как обычно, можно получить с помощью профилировщика
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
16.02.2021, 11:16
Цитата Сообщение от DrOffset Посмотреть сообщение
Точный ответ, как обычно, можно получить с помощью профилировщика
сверх гигантский объект в любом случае нужно по константной ссылке передавать же?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.02.2021, 11:21
_stanislav, то, что компилятор не может сделать предположений о том что вызывающий код не изменит объект по ссылке (или константному указателю, кстати тоже), это понятно. Я не спорю с ружьём на стене, даже если оно не заряжено. Получить заряд из незаряженного ружья ещё обиднее. Но против лома нет приёма. Если не лочить в многопоточке, делать неосторожные вещи при колбеках или использовать глобальный доступ, то это не намного лучше чем прямо внутри функции установить на "одетую в броню" свечу константную ссылку и ... далее по тексту (скастить, отдать в код который это сделает и пр.) Для того и используется принцип "разделяй и властвуй", - модульность, локальность и пр., чтобы ружье не поскакало. Вместе с избушкой. Мне приходилось видеть функции (в серьёзных проектах, кстати), которые не влазили в 5 экранов... Их все боялись трогать. Ни кто не может помешать кому-то творить такое. Обезопасить такого человека, это только загонять проблему под ковёр.

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
б) Нам по каким-то причинам важно избегать косвенной адресации даже в ущерб накладному копированию (например функция работает долго, постоянно обращается к данным, а копирование можно сделать один раз при вызове, т.е. не смотря на дорогое копирование, его влияние минимально за счет того, что выполняется оно один раз).
Кто мешает в самом начале функции инициализировать значение принудительно? Передача лишнего указателя может помешать (зашитого по ссылке (в посылке ))? Но здоровый сон, ведь дорого стоит? Случай то ведь необычный. Но в принципе понятно, - спасибо)
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
16.02.2021, 11:22
Цитата Сообщение от IGPIGP Посмотреть сообщение
Для того и используется принцип "разделяй и властвуй"
то есть если где то я передаю сверх гигантский объект в функцию, значит у меня в проектировании есть проблемы?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.02.2021, 11:32
Цитата Сообщение от _stanislav Посмотреть сообщение
то есть если где то я передаю сверх гигантский объект в функцию, значит у меня в проектировании есть проблемы?
Нет. Я отвечал на пост с цитатой от Джосаттис и др. Что касается больших объектов, то можно такие придумать, что и стек развалить недолго и тут только по адресу и больше никак.
_stanislav, понимаешь, если передача родственной семантики вариируется, это ведёт к комбинаторному росту специализаций шаблонов, где потом можно такую функцию передать. Это как для указателей специализировать передачу указателя на char)) Нюансы дорого стоят. Хотя без них медленно и тупо. Вечная дилемма)
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.02.2021, 11:52
Цитата Сообщение от IGPIGP Посмотреть сообщение
Кто мешает в самом начале функции инициализировать значение принудительно?
Никто не мешает. Это будет эквивалент передачи по значению.
0
16.02.2021, 11:55

Не по теме:


Врач, строитель и программист поспорили о том, чья профессия древнее.
Врач заметил: "В Библии сказано, что Бог создал Еву из ребра Адама. Это мог
сделать только хирург, поэтому моя профессия самая древняя в мире". Его
перебил строитель: "Однако, как сказано в Книге Бытия, еще раньше Бог сотворил
из хаоса сначала небо, а потом — землю. Это было первое и, несомненно,
наиболее впечатляющее строительство. Следовательно, дорогой доктор, вы ошибаетесь.
Именно моя профессия самая древняя в мире". Услышав это, программист
откинулся на спинку кресла, улыбнулся и спросил доверительным тоном: "Ну а кто
же, по-вашему, создал хаос?"

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.02.2021, 12:00
Цитата Сообщение от _stanislav Посмотреть сообщение
сверх гигантский объект в любом случае нужно по константной ссылке передавать же?
Почему? А вдруг его вообще переместить можно?
Ну и от задачи зависит же. Вдруг "сверхгигантское" копирование - это часть бизнес-логики?

На самом деле все правильно, константная ссылка - можно сказать, что вариант по умолчанию. В современном С++ добавилась семантика перемещения, и теперь нужно еще следить когда она уместнее, чем передача по (константной) ссылке. Но в целом все остается на прежнем уровне (т.е. как написано в книгах по эффективному С++). Профилировщик покажет где была упущена производительность, а вещи, о которых я говорил выше, просто помогут правильно проинтерпретировать результат и сделать в коде соответствующие изменения.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.02.2021, 12:16
Цитата Сообщение от DrOffset Посмотреть сообщение
Никто не мешает. Это будет эквивалент передачи по значению.
О том и речь. Ведь обезопаситься от невероятного, невозможно. При передаче константной ссылки можно и на ней инициализировать значение так, что - держись! Например, если использовать move выпотрошив ссылку, можно инициализировать константу значения (пусть знают как недоплачивать за сверхурочные) Тогда станет ещё веселее, чем непреднамеренное изменение константной ссылки (это трудно сделать непреднамеренно, без квалификации).
Цитата Сообщение от _stanislav Посмотреть сообщение
"Ну а кто же, по-вашему, создал хаос?"
Ты имеешь ввиду, что у нас с Адамом разные родители? Князь тьмы хохочет)
Есть и более простое объяснение.
Вначале было слово. И слово было у Бога. В памяти .
Без плана, трудно что-то создать. Бог был программистом. Представитель древнейшей профессии.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.02.2021, 12:25
Цитата Сообщение от _stanislav Посмотреть сообщение
какой такой?
Выше над этой фразой написано какой
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
16.02.2021, 12:32
Цитата Сообщение от DrOffset Посмотреть сообщение
Выше над этой фразой написано какой
как я понял это подход при котором константность параметра в определении есть а в объявлении нет, но если ты такой подход защиты наблюдал редко, как обычно поступают что бы защитить аргумент от изменения?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.02.2021, 12:35
Цитата Сообщение от _stanislav Посмотреть сообщение
как я понял это подход при котором константность параметра в определении есть а в объявлении нет, но если ты такой подход защиты наблюдал редко, как обычно поступают что бы защитить аргумент от изменения?
Да никак не поступают. Просто оставляют его неконстантным (речь о варианте передачи по значению). Т.е. все на уровне неявной договоренности.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
16.02.2021, 12:38
Цитата Сообщение от DrOffset Посмотреть сообщение
Да никак не поступают. Просто оставляют его неконстантным (речь о варианте передачи по значению). Т.е. все на уровне неявной договоренности.
поэтому я в кодах в книгах никогда не видел такой связки const int, вообще о такой технике никто не упоминал никогда, сколько я не читал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2021, 12:38

Модификатор доступа const
Здравсвуйте, прошу помочь с вопросом. В общем имеется такой класс: class Animator : public sf::Drawable { private: ...

Модификатор static для функций, используемых в main
Всем привет, у меня такой вопрос, если ли возможность в следующем коде как-то избежать добавления модификатора static к функции sort класса...

Модификатор const Очередные грабли с++?
Представленный ниже код не компилируется. В чем здесь может быть проблема? class CFirst { public: int GetValue() { return...

Модификатор const в качестве возвращаемого значения
const int get_size(const int&amp; a) { return a; } int main() { const int size = get_size(5);

Чисто виртуальные классы. Модификатор const
Приветствую всех! Известно, что чисто виртуальный (абстрактный) класс можно получить class A { public: virtual void test()=0; };...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 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), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru