Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/131: Рейтинг темы: голосов - 131, средняя оценка - 4.52
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549

Архитектура: парсинг и выгрузка текстовиков

11.03.2020, 10:51. Показов 32433. Ответов 421

Студворк — интернет-сервис помощи студентам
начало было положено в ветке - Считать текстовые файлы из папки - там и возник вопрос об Архитектуре...
Цитата Сообщение от JeyCi Посмотреть сообщение
так и не собрала эти все объекты этого класса в group class...
вроде уже собрала...
осталось отображение создать (типа I_tbl_Show) и пронаследовать ? в разные классы пункта назначения (или на консоль, или в файл, или в БД, или допустим ещё в форму)... N.B. классы (пункты-назначения) делать не надо - эти View уже реализованы разработчиками того ПО, на котором сейчас идёт работа...
а) пока что можно просто прописать функции-члены класса; и по месту использовать, что надо при разработке - в файл или на консоль;
б) в перспективе для Release - реализовать и откомпилировать и выгрузку и в файл, и выгрузку в БД, и отражение в DataGrid...
===
!! Т.Е. если в Release захочется и выгрузку в текст, и в БД, и допустим ещё в форму (например с разных кнопок сделать) - тут уж лучше и писать, как положено, наследование??... -- к слову из прошлой ветки о:
Цитата Сообщение от JeyCi Посмотреть сообщение
полагаю тут Наследования никакого не пригодится?
... или как раз тут (при выборе направления выгрузки) его (наследование) делать??
===
Обоснование выбора уровня Абстракции (I_tbl_Show со всеми виртуальными функциями):
чтобы не дублировать код-сбора-для-выгрузки -- сделать class Table - и класс-интерфейс I_tbl_Show, в котором обозначить virtual-функции выгрузки... эти функции определить в др. классах - типа Interface (IwriteCSV, IwriteDB, IwriteDataGrid)...
p.s.
классы консоль, файл, бд, DataGrid - не создаём, т.к. эти пункты назначения уже присутствуют...
p.p.s.
вывести конечные интерфейсы с определёнными методами записи на кнопки...
===
ИЛИ то, что подчёркнуто чуть выше, стоит реализовать в одном классе Table, и здесь же задать все virtual функции ??
===
на скрине: синие - классы, зелёные - интерфейсы (в с++ по сути тоже классы)
птицами отмечены уже кое-как реализованные классы (2 птицы)
курсивные стрелки - отсутствие наследования


Добавлено через 7 минут
вобщем вопрос:
class Table и класс I_Tbl_Show - объединить или нет?

Добавлено через 10 минут
p.p.s.
чтобы избежать проблем Ромба и такого:
Неоднозначность при множественном наследовании
Цитата Сообщение от DrOffset Посмотреть сообщение
Тут нужно виртуальное наследование.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2020, 10:51
Ответы с готовыми решениями:

Проверка двух текстовиков
Написать прогу на языке Си, проверяющую, совпадают ли тексты в двух файлах #include <stdio.h> #include <stdlib.h> ...

Access модуль объединения текстовиков
Добрый день. Очень нужен модуль access который будет объединять текстовые файлы с предложенной папки (каждый раз разные названия и...

Сделать скрипт для вывода текстов из текстовиков
Здравствуйте! Не могли бы помочь сделать скрипт для вывода текстов песен из текстовиков в папке. Расскажу подробней: есть папка с...

421
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.06.2020, 09:36  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
Что такое Atomic ?
начиная с 2016 в U++
One of biggest advances of C++11 is support for multithreading memory model. That is why we could drop U++ memory model support and use what language/standard library provides - Atomic is now reimplemented using std::atomic<int>, thread local variables are language standard.
- для counter'a (примерно так)...
std::atomic
CoDo. In this pattern, the job is simply started in all threads and the code is responsible for scheduling the work. CoDo waits for all started threads to finish. Scheduling is the responsibility of client code, but can be easily managed using the std::atomic counter. This way, the overhead associated with creating lambdas and scheduling them is kept to the minimum (basically the cost of atomic increment). Once again, CoDo is based on CoWork, so CoWork::FinLock is available.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Vector<String> data;
for(int i = 0; i < 100; i++)
    data.Add(AsString(1.0 / i));
 
double sum = 0;
 
std::atomic<int> ii(0);
 
CoDo([&] {
    double m = 0;
    for(int i = ii++; i < data.GetCount(); i = ii++)
        m += atof(data[i]);
    CoWork::FinLock();
    sum += m;
});
 
DUMP(sum);

просто слово ProcessEvent давало надежду - оказалось немного не то...
расковыряю WhenAction и др, и Postcallback'и - смогу точнее определиться по возможностям ide...
просто интересны эти circumstances в цитате:
// While PostCallback is still useful in certain circumstances, new applications are perhaps better off using GuiLock and Call, as demostrated in GuiLock reference example.
p.s.
за ваше замечание по коллбэкам спасибо - но на него цитата выше про Call... наверно, просто правильно расставить мьютексы на GUI (хотя GUILock это и делает) - чтобы избегать тот possible race condition... имхо

Добавлено через 3 минуты
p.p.s
и кстати, вызывая thread из thread'a - полагаю, и тот counter уже не нужен, как Atomic, если с i работает только 1 thread (в смысле пишет, читать могут два)

Добавлено через 1 час 49 минут
ой ... в смысле взаимодействие между ЭУ формы - это даже не взаимодействие между потоками... т.к. оба ЭУ находятся в одном потоке (GUI), а исполняющий код запущен один (а не многопоточно) - в том варианте, как я его перекроила на скорую руку... т.е. получилось обычное взаимодействие GUI и исполняющего основную рутину кода - по сути обычные 2 потока...
p.p.p.s всё-таки, если уж очень захочется покреативить Observer'a можно попробовать вставить в какой код... но пока разобраться с основами возможностей...

Добавлено через 32 минуты
===
Цитата Сообщение от JeyCi Посмотреть сообщение
расковыряю WhenAction и др, и Postcallback'и
всё-таки в Progress'e, видимо, 1-е не очень работает, как хотелось бы того... люди использовали 2-е... сейчас уже GuiLock
===
задача на данном этапе сводится к тому, чтобы цикл из одного класса отразить в класс myApp (GUI) и соответственно поток GUI из исполняющего потока этого класса Gui... поэтому в #209 и возник вопрос о правильности выбора инкапсуляции... - когда цикл в одном классе, а progress в другом... - как туда постучаться, да ещё и в соседний thread от исполняющего класса, т.е. его gui thread... вобщем выбора, наверно, не остаётся, кроме как принимать указатель gui в конструкторе downloader'a, а метод ShowProgress размещать не в классе Gui, а в классе Downloader... имхо
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
28.06.2020, 21:45
Лучший ответ Сообщение было отмечено JeyCi как решение

Решение

Цитата Сообщение от JeyCi Посмотреть сообщение
кроме как принимать указатель gui в конструкторе
Не обязательно в конструкторе.
Кликните здесь для просмотра всего текста
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <CtrlLib/CtrlLib.h>
 
using namespace Upp;
 
volatile int manstop = 0;
 
Mutex mtx;
 
struct MainWindow : public TopWindow
{
    Button m_start;
    Button m_cancel;
    StatusBar m_status;
    ProgressIndicator m_progress;
 
    MainWindow()
    {
        Title ( "Тест" );
        Add ( m_start.SetLabel ( "Старт" ).LeftPos ( 10, 80 ).TopPos ( 10, 20 ) );
        Add ( m_cancel.SetLabel ( "Отмена" ).LeftPos ( 10, 80 ).TopPos ( 40, 20 ) );
        Add ( m_progress.LeftPos ( 10, 200 ).TopPos ( 70, 20 ) );
        AddFrame ( m_status );
 
        m_progress.Set ( 0, 100 );
 
        m_cancel.WhenAction = []
        {
            Mutex::Lock __ ( mtx );
            manstop = 1;
        };
    }
};
 
class Worker
{
 
    public:
        void Start ( StatusBar* pstatus,  ProgressIndicator* pprogress );
 
    private:
        StatusBar* m_pstatus;
        ProgressIndicator* m_pprogress;
        Thread m_thread;
        volatile Atomic m_pos;
        void Work();
        void WorkP ( String filename );
};
 
void Worker::Start ( StatusBar* pstatus,  ProgressIndicator* pprogress )
{
    m_pstatus = pstatus;
    m_pprogress = pprogress;
 
    Mutex::Lock __ ( mtx );
    manstop = 0;
 
    m_thread.Run ( [=]{this->Work();} );
 
};
 
void Worker::Work()
{
 
    bool on = true;
    CoWork cw;
    m_pos = 0;
 
    Vector <String> fname;
 
    //Создаем список (вектор) имен файлов
    for ( int i = 0; i < 200; i++ )
        fname << ( IntStr ( i ) + ".txt" );
 
 
    m_pprogress->Set ( 0, fname.GetCount() );
 
    int i = 0;
 
    while ( on )
    {
        if ( i < fname.GetCount() )
        {
            /*Пул потоков*/
            cw & [=, &fname]{this->WorkP ( fname[i] );};
            ++i;
        }
 
        else
        {
            /*Ожидаем завершения пула потоков
            проверяя каждые четвертьсекунды*/
 
            if ( cw.IsFinished() )
            {
                GuiLock __;
                m_pstatus->Set ( "Выполнено" );
                on = false;
            }
 
            else
                Sleep ( 250 );
        }
 
 
 
        Mutex::Lock __ ( mtx );
 
        if ( manstop == 1 )//Проверяем на отмену
        {
 
            if ( !cw.IsFinished() )
                cw.Cancel();//Отменяем задания для пула
 
            on = false;
            GuiLock __;
            m_pstatus->Set ( "Отмена" );
            m_pprogress->Set ( 0 );
 
        }
    }
 
};
 
    
void Worker::WorkP ( String filename )
{
    /*Этот код выполняется параллельно*/
    
    
    /*Выполняется какая-то
    длительная обработка*/
    Sleep ( Random() % 2000 );
 
 
    /*Результат передается в GUI*/
    GuiLock __;
    m_pstatus->Set ( filename );
    m_pprogress->Set ( AtomicInc ( m_pos ) );
 
};
 
 
 
GUI_APP_MAIN
{
    Worker worker;
    MainWindow w;
 
    w.m_start.WhenAction = [&worker, &w]
    {
        worker.Start ( &w.m_status, &w.m_progress );
    };
    w.SetRect ( 0, 0, 300, 200 );
    w.Run();
}
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 09:40  [ТС]
Цитата Сообщение от GoshaM Посмотреть сообщение
Не обязательно в конструкторе.
выдаёт assertion failed in CoWork.cpp (line 64) - (!IsWorker) - отсюда:
C++
1
2
3
4
5
6
7
8
9
10
11
12
CoWork::Pool::Pool()
{
    ASSERT(!IsWorker());
 
    InitThreads(CPU_Cores() + 2);
 
    free = NULL;
    for(int i = 0; i < SCHEDULED_MAX; i++)
        Free(slot[i]);
    
    quit = false;
}
Добавлено через 5 минут
выскакивает здесь:
C++
1
2
3
4
5
         {
            /*Пул потоков*/
            cw & [=, &fname]{this->WorkP ( fname[i] );};
            ++i;
        }
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 09:47  [ТС]
в пошаговом режиме
Миниатюры
Архитектура: парсинг и выгрузка текстовиков  
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 13:02  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
/*Пул потоков*/
честно говоря, в этом контексте даже простая строка
C++
1
2
//auto w = Async([=]{while(!CoWork::IsCanceled()) {Sleep(10);};});
auto w = Async([=]{Sleep(10);});
выдаёт такую же ошибку...
вероятно, проблема не в пуле потоков,
а, может быть, в передаче управления из gui-thread в work-thread??
но до фомирования cw - всё идёт ок в void Work() (который во вторичном потоке)
т.е. проблема в формировании третичных и т.д. потоков?

Добавлено через 1 час 9 минут
GoshaM,
я, конечно, понимаю, что у вас, вероятно. WIN64, а у меня WIN32 - но всё-таки выложите, пожалуйста, настройки вашего Build Method ??

Добавлено через 1 минуту
(в main package configuration - MT я подключила)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 13:51
Цитата Сообщение от JeyCi Посмотреть сообщение
я, конечно, понимаю, что у вас, вероятно. WIN64, а у меня WIN32 - но всё-таки выложите, пожалуйста, настройки вашего Build
И как же Вы U++ запускаете на x32? Там же вроде только x32 ?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 14:12  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
на x32? Там же вроде только x32 ?
в чём вопрос?

Добавлено через 11 минут
упс на v.11863 - запустилось!!
на v.13664 - не хочет...
что-то где-то я уже сама доотключалась, наверное
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 14:16
Приехали ... сейчас актуальная v.14 + версия.
А v.11863 вообще древняя я даже найти не могу её на сайте. Ясно что еще 2016 года.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 14:23  [ТС]
и так красиво плывёт progress в ногу со status'ом... что я уже и в ThreadPool на U++ верю
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 14:48
Главное когда плывет прогресс попробовать подергать за окно программы и потакать его по экрану если синхронизации нет приложение скорее всего повиснет или упадет.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 15:33  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
если синхронизации нет приложение скорее всего повиснет или упадет.
неее.. не падает
там же всё в исполняющем потоке, а синхронизация с GUI-потоком через GUILock (который по header'у вроде на мютексе - смотреть надо)...
и volatile Atomic m_pos; -- AtomicInc ( m_pos ) для progress'a...
и possible race condition от Call нет, т.к. Call не используется...
красивый код...
буду пробовать внедрять новые идеи...
и на повестке, возможно, ещё останется WorkQueue и Semaphores...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 17:46
del
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 19:06  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Приехали ... сейчас актуальная v.14 +
Nightly версии они выкладывают для win64...
2019.1 (rev 13068) (May 2019) - сделали они что-то:
•New CoWork variant CoWorkNX solves an compilation problem when using CoWork as member variable
может в win32 v.13664 что-то и поплыло с версии 11863 (там ещё не было toUpper функции - поэтому ушла с 11-й u++)...
буду смотреть, какой last stable release для win32...

Добавлено через 3 минуты
2020.1 (May 2020) - вроде в Core и:
•ConditionVariable and Semaphore now have Wait variant with timeout
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 19:39
GoshaM, Нет твой код явно что-то не то (мягко выражаясь)
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 19:53  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
что-то где-то я уже сама доотключалась, наверное
а вот это - нет...
перестановила 13664 - bug остался
скачала last stable 14429 - он для win64

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
что-то не то
что смущает?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 19:59
Да все. Не нужны там мютексы так как есть атомики. И блокировки неправильно используются.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 20:29  [ТС]
так мьютекс для manstop,
а atomic для progress_pos - насколько вижу...
-- они же для разных целей... имхо... мне кажется, вы зря паникуете
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 20:32
Как то так:

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
#include <CtrlLib/CtrlLib.h>
 
#include  <atomic>
 
using namespace Upp;
 
class MainWindow : public TopWindow
{
    public:
        typedef MainWindow CLASSNAME;
 
        MainWindow();   
        
        
    private:                  
        ProgressIndicator progress;
        Button button;
        StatusBar status;
        Image ImgCrs;
        
        Thread secondaryThread;                
        std::atomic<bool> isInterruptionRequested= true; // атомарный флаг !
        
    private:
        void buttonClicked();                 
        void threadFunction();
};
    
MainWindow::MainWindow()
{
    SetRect(0, 0, 300, 150);
    Add(button);
    button.TopPos(90, 30).HCenterPos(100);
    button.SetLabel("START");
    Add(progress);
    progress.TopPos(30, 40).HCenterPos(250);
    progress.Set(0, 100);
    AddFrame(status);
    status.Set(" ");
 
    button <<= THISBACK(buttonClicked);        
}
 
void MainWindow::buttonClicked()
{   
    if(isInterruptionRequested)
    {
       isInterruptionRequested= false;
       secondaryThread.Run(THISBACK(threadFunction));
       button.SetLabel("STOP");       
    }     
    else
    {
       isInterruptionRequested = true; // запрос на остановку потока
       button.SetLabel("STOPING ...");
    }
}
 
void MainWindow::threadFunction()
{
    for(int i=0; i<=100 &&  !isInterruptionRequested; i+=10)
    {   
        { // Синхронизация для обновления гуи
          GuiLock lockGuard;
          progress.Set(i); // действия требующие согласования/синхронизации.
        } // выход из синхронизации, блокировка снимается с разрушением lockGuard.
        
        Sleep(1000); // тут полезная работа 
    }
    
    { // Синхронизация
        GuiLock lockGuard;
        button.SetLabel("START");
    } // выход из синхронизации    
}
 
 
GUI_APP_MAIN
{
    MainWindow().Run();
}
В место std::atomic наверное можно использовать из U++.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 20:34  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
И блокировки неправильно используются
на всякий случай
Alternatively, GuiLock is really simple:
struct GuiLock {
GuiLock() { EnterGuiMutex(); }
~GuiLock() { LeaveGuiMutex(); }
};
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 20:37
Вы в код посмотрите,там нет вызова деструкторов. И gui блокируется дольше чем нужно.
И использовать мютексы когда есть атомарные переменные это ....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2020, 20:37

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?

архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников
сабж. кто чем может помочь юному,непонемающему в этой области человеку.желательно книгами.спасибо.

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку &quot;Проверить соединение&quot; Я прочитал, что это возможно из за того, что моя система 64, а...

Архитектура бд
Я начинающий php-разраб. Пишу свой проект для своего города. Но встал вопрос о архитектуре. Пользователь создает свою страницу с...

Архитектура БД
Доброго времени суток.Задание написать АИС Учёт абонентов телефонной сети предприятия. Краткое описание предметной области: В состав...


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

Или воспользуйтесь поиском по форуму:
240
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
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
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru