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

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

11.03.2020, 10:51. Показов 32410. Ответов 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
02.07.2020, 11:26  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JeyCi Посмотреть сообщение
я там кстати вызывала через Call...
по Call есть предепреждение по race condition possible... поэтому тоже не очень хочу её подряжать в совокупности с GuiLock
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 11:28
Цитата Сообщение от DrOffset Посмотреть сообщение
Лучше, когда библиотека дает возможность отправить "запрос" на изменение GUI. Т.е. в вашем поточном методе вы могли бы создать "событие" изменения GUI, и отправить его основному потоку. А тот уже когда это возможно и безопасно выполнил бы его на своей стороне.
Executes a callback in the main thread (the one responsible for GUI). It works by posting callback into timer queue (with zero delay), then waits its completion using Semaphore. Main GUI thread has to run timer queue management for callback to be executed (by running event-loop (TopWindow::Run) or ProcessEvents).
Практически один в один.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 11:35  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
It works by posting callback into timer queue
вот в том то и дело - callback-то пока один - на 1 thread в котором проходит весь цикл for - в #277...
а вызывать др callbacks - они встанут в очередь на действие "а посля" - понимаю так... имхо (и по тому WhenAction, который "удивил", начав работать "а посля")

Добавлено через 6 минут
- там пробовала, потом закоментировала
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 12:06
JeyCi, не вижу причин, чтобы это не работало. Пробуйте еще.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.07.2020, 12:10
Цитата Сообщение от JeyCi Посмотреть сообщение
время отняли.
Не будут отнимать Ваше время, коль Вы его так цените что не можете залить выложить минимальный работоспособный проект.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 12:16  [ТС]
и что самое интересное - (во вторичном потоке) -
C++
1
2
3
4
5
                {
                    GuiLock __;
                    pw->status=GetFileName(fileName);
                    GuiUnlock __2;
                }
при 1-ом нажатии Stop - застывает текущий обрабатываемый filename, а при повторном нажатии Stop - в status появляется Stopped... думаю, что лочить НЕ нельзя, а просто стоит использовать не struct GuiLock, а как-то пошаманить мьютексами...
p..s.
вообще лок или сигнал в очередь на обработку - думаю не принципиально для отражения в status...
когда же в GUI надо сбрасывать много рисования, например, из вторичного потока, когда ему самому ещё работать и работать - то это лишь вопрос быстродействия останется... с сигналами, возможно, и можно не тормозить сильно... но оставлять всё на "а посля" - выигрыш по времени тоже сомнительный...
вобщем пробую дальше
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 12:22
Цитата Сообщение от JeyCi Посмотреть сообщение
думаю, что лочить НЕ нельзя, а просто стоит использовать не struct GuiLock, а как-то пошаманить мьютексами...
Нет. Ничего хорошего вы не нашаманите.

Цитата Сообщение от JeyCi Посмотреть сообщение
но оставлять всё на "а посля" - выигрыш по времени тоже сомнительный...
Вы никогда человеческим глазом не увидите разницу. Это "а-посля" выльется в наносекунды.
А вот гораздо более важная проблема верного распределения ответственностей решится раз и навсегда.

Представьте себе художника, который рисует картину. И несколько других людей, которые в рандомные моменты времени останавливают его и дорисовывают что-то сами. Вот именно так сейчас у вас и работает.

Я достаточно писал сам и видел систем, наподобие этой UPP, чтобы сказать, что это путь в никуда.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 12:31  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
минимальный работоспособный проект.
да не нужен вам весь проект, если по части которую я выложила вы ответить не смогли - если с примером вопрос не понятен, то и не теряйте своё время...
DrOffset-у, спасибо!! за знакомство с deadlock'ом - профи всегда его распознают...
пока вы Avazart, кричите, что вам мьютексы (лок) и слипы (любое действие вместо него) глаза мозолят - так и не смотрите на них, что ли...

Добавлено через 7 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Представьте себе художника, который рисует картину. И несколько других людей, которые в рандомные моменты времени останавливают его и дорисовывают что-то сами. Вот именно так сейчас у вас и работает.
ну, не совсем... ходожник рисует от души... состояние души - изменчиво... а RAM и CPU - постоянны - скорее с магистралью и светофорами можно сравнить (или ГАИшником на перекрёстке) - каким байтам остановиться, каким куда двигаться... - просто отрегулировать надо... имхо... (при всём том, что сигналить слотам при хорошей библиотеке - может быть попроще, чем сделать удобную развязку дорог, не создавая пробки, и используя минимальное количество ГАИшников)... имхо... но за предупреждение спасибо...
0
02.07.2020, 12:31

Не по теме:

Цитата Сообщение от JeyCi Посмотреть сообщение
да не нужен вам весь проект
Мадам! Да мне это вообще нафиг не нужно!
Просьба больше меня не упоминать в теме.

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 12:35
JeyCi, в общем я понял, что пока вы сами этот кирпич не словите, будете спорить. Ну ладно, я подожду.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 12:54  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
проблема верного распределения ответственностей решится раз и навсегда.
беру на заметку - что принципы SOLID ООП ещё никто не отменял...

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
пока вы сами этот кирпич не словите, будете спорить
я не спорю - я хочу сделать более удобным то, что и так работает, вместо того чтобы переписывать всё на др библиотеку... а др. проекты, возможно, на др библиотеки (точнее др фреймворк) и перейду... просто пока, чтобы проникнуться азами новой темы "потоки" - может здесь и удобнее увидеть воочию сам deadlock, чем читать о нём в книжках... или ещё какие тонкости многопоточности
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 12:56
Лучший ответ Сообщение было отмечено JeyCi как решение

Решение

JeyCi,

Цитата Сообщение от JeyCi Посмотреть сообщение
я не спорю - я хочу сделать более удобным то, что и так работает, вместо того чтобы переписывать всё на др библиотеку..
Господь с вами, где я предлагал другую библиотеку? Я предлагаю вот что:

main.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
#include "TestThread.h"
 
TestThread::TestThread()
    : isInterruptionRequested(false)
{
    CtrlLayout(*this, "Window title");
    
    Btn1 <<= THISBACK(btn1_Click);
    Btn2 <<= THISBACK(btn2_Click);
    
    Progress.Set(0, 100);
}
 
void TestThread::WorkerThread()
{
    PostCallback([=] { 
        Status.SetText("Working..."); 
    });
        
    for(int i = 0; i < 100; ++i)
    {
        Sleep(100);
        
        if(isInterruptionRequested)
            return;
        
        PostCallback([=] { 
            Progress.Set(i, 100); 
        });
    }
}
 
void TestThread::btn1_Click()
{
    Btn1.Deactivate();
    Status.SetText("Started!");
    
    isInterruptionRequested = false;
    work.Run ( [=]{ WorkerThread(); } );
}
 
void TestThread::btn2_Click()
{
    isInterruptionRequested = true;
    work.Wait();
        
    Status.SetText("Stopped!");
    Btn1.Activate();
}
 
GUI_APP_MAIN
{
    TestThread().Run();
}

TestThread.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
#ifndef _TestThread_TestThread_h
#define _TestThread_TestThread_h
 
#include <CtrlLib/CtrlLib.h>
 
using namespace Upp;
 
#define LAYOUTFILE <TestThread/TestThread.lay>
#include <CtrlCore/lay.h>
 
class TestThread : public WithTestThreadLayout<TopWindow> {
public:
    typedef TestThread CLASSNAME;
    TestThread();
    
private:
    void btn1_Click();
    void btn2_Click();
                
    void WorkerThread();
                
    Thread work;
    std::atomic<bool> isInterruptionRequested;
};
 
#endif

TestThread.lay
Code
1
2
3
4
5
6
LAYOUT(TestThreadLayout, 324, 152)
    ITEM(ProgressIndicator, Progress, LeftPosZ(64, 184).TopPosZ(24, 24))
    ITEM(Button, Btn1, SetLabel(t_("Start")).LeftPosZ(64, 56).TopPosZ(112, 15))
    ITEM(Button, Btn2, SetLabel(t_("Stop")).LeftPosZ(192, 56).TopPosZ(112, 15))
    ITEM(Label, Status, LeftPosZ(76, 160).TopPosZ(72, 19))
END_LAYOUT
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 13:42  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
количество ГАИшников
всё-таки добавлю... Memory Barriers тоже как-то надо то ли учитывать, то ли создавать?.. скорее учитывать... и тут уж дело не только в "гаишниках" (локах) ...
но RWLock может даже попроще, чем Mutex в U++
==
За PostCallback - спасибо!! - его тоже надо было как-то увидеть воочию - с кнопки, запускающей доп. поток, который Правильно ставит в очередь свои коллбэки... увидела на родном примере - и сразу всё становится на свои места... у этого кода ноги растут нормально... Благодарю! буду изучать и применять
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 13:54
JeyCi, или можно оставить GuiLock, но изменения в виджете надо делать не напрямую, а через функцию Call.
Тогда поточная функция из моего примера выглядеть будет как-то так:
Кликните здесь для просмотра всего текста
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
TestThread::TestThread()
    : isInterruptionRequested(false)
{
    CtrlLayout(*this, "Window title");
    
    Btn1 <<= THISBACK(btn1_Click);
    Btn2 <<= THISBACK(btn2_Click);
    
    Progress.Set(0, 100);
}
 
void TestThread::WorkerThread()
{
    {
        GuiLock __;
        Call([=] { 
            Status.SetText("Working..."); 
        });
    }
        
    for(int i = 0; i < 100; ++i)
    {
        Sleep(100);
        
        if(isInterruptionRequested)
            return;
        {
            GuiLock __;     
            Call([=] { 
                Progress.Set(i + 1, 100); 
            });
        }
    }
    
    {
        GuiLock __;
        Call([=] { 
            Status.SetText("Done!");
            Btn1.Enable();
            Btn2.Disable();         
        });
    }
}
 
void TestThread::btn1_Click()
{
    Btn1.Disable();
    Btn2.Enable();
    Status.SetText("Started!");
    
    isInterruptionRequested = false;
    work.Run ( [=]{ WorkerThread(); } );
}
 
void TestThread::btn2_Click()
{
    isInterruptionRequested = true;
    work.Wait();
        
    Status.SetText("Stopped!");
    Btn1.Enable();
    Btn2.Disable();
}
 
GUI_APP_MAIN
{
    TestThread().Run();
}


Добавлено через 6 минут
Цитата Сообщение от JeyCi Посмотреть сообщение
ну, не совсем...
Как вы уже поняли, пойнт ситуации в том, что ему мешают, а не в том как он рисует. Так что от души или нет - значения здесь не имеет совсем.

Добавлено через 2 минуты
Это тоже, кстати, полезный навык выделять главное из цельного описания.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 14:03  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
можно оставить GuiLock, но изменения в виджете надо делать не напрямую, а через функцию Call.
да, именно так они и позиционировали свой GuiLock (совместно с Call), которые пришли на смену PostCallback'у... меня просто их замечание о possible race condition (от Call) смущало... не хватает ещё опыта прикинуть в каких обстоятельствах по коду может вылезти?.. и как соблюдать эти Memory Barriers без гаишников?
Цитата Сообщение от DrOffset Посмотреть сообщение
пойнт ситуации в том, что ему мешают, а не в том как он рисует.
( просто реставраторы ещё и поверх нарисованного могут нарисоват, чтобы выровнять или искривить )...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 14:11
Цитата Сообщение от JeyCi Посмотреть сообщение
просто реставраторы ещё и поверх нарисованного могут нарисовать
Это уже совсем другая история

Цитата Сообщение от JeyCi Посмотреть сообщение
да, именно так они и позиционировали свой GuiLock (совместно с Call), которые пришли на смену PostCallback'у
Не смотря на это - работает оно все так же, как я написал:
Лучше, когда библиотека дает возможность отправить "запрос" на изменение GUI. Т.е. в вашем поточном методе вы могли бы создать "событие" изменения GUI, и отправить его основному потоку. А тот уже когда это возможно и безопасно выполнил бы его на своей стороне.
незначительно отличаются технические детали.

И работает оно так, потому что это единственный способ контролировать сложность. По-другому просто не получится.

Цитата Сообщение от JeyCi Посмотреть сообщение
их замечание о possible race condition смущало
Warning: Call temporarily unlocks GuiLock (if locked) so that the main thread can run on GUI, this is possible source of race-conditions (GuiLock is relocked after call completes). Be prepared that some other code can run on GUI between call to Call and cb being executed!
Это?
Выстрелить это может, если у вас есть два или более потоков одновременно меняющих GUI.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 14:23  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Выстрелить это может, если у вас есть два или более потоков одновременно меняющих GUI.
значит теперь, если пробовать всё это переводить на thread_pool (тот for, который в WorkerThread'e) - то тут и сможет выстрелить?.. (теоретически, библиотеку не смотрела)...
хотя по сути задачи понадобиться WorkQueue... по сути...
или одно другому не мешает (thread_pool и workqueue)?.. да ещё и выстрелить может? (в thread_pool'e? или в thread-safe workqueue'е?)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
02.07.2020, 14:30
JeyCi, нет, я неправильно выше сказал. Все, что приходит из потоков будет упорядоченно очередью. Речь видимо все-таки о работе основного потока.
Проще всего не допускать этого совсем, и не разрешать менять из основного потока то, что может измениться под влиянием второстепенных.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
02.07.2020, 17:59  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Проще всего не допускать этого совсем, и не разрешать менять из основного потока то, что может измениться под влиянием второстепенных.
ух - вот это объяснение! - на все случаи жизни... понимание - которого мне очень не хватало, чтобы не остерегаться потоков...
Thanks a lot !!

Добавлено через 13 минут
p.s. всё-таки добавлю: или блокировать (синхронизировать)... если вдруг случится такое, что надо всё-таки...

Добавлено через 3 часа 5 минут
p.p.s и чтобы, обойдя одни грабли, не попасть на вторые - я процитирую вас ещё раз
Цитата Сообщение от DrOffset Посмотреть сообщение
Но GuiLock для своей эффективности должен работать на обеих сторонах. Я тоже не лазил в библиотеку, но это просто следует из того поведения, которое вы описывали и общей логики построения программы. Чтобы GuiLock работал, методы, которые являются обработчиками элементов GUI тоже должны быть защищены этим локом. Библиотека сама выставляет лок, чтобы это обеспечить. Поэтому, когда вы находитесь в обработчике кнопки, то лок уже выставлен самой библиотекой на стороне главного потока, и соответственно ваш второй поток не может зайти в лок на своей стороне. При этом главный поток у нас меняет переменную состояния, для выхода, и переходит в ожидание этого выхода, но т.к. второй поток висит на ожидании своего лока, то ничего не происходит. В итоге - deadlock.
т.к. struct GuiLock - это по сути мьютексы в ней...
p.p.p.s.
про Atomic (полагаю. lock-free возможность обеспечивать thread-safety) - отдельная история - oleg-m1973 оставлял здесь (#159) линк
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
и, чтоб добить - есть ещё вот такая интересная статья - https://habr.com/ru/post/328362/
Добавлено через 5 минут
вот и ИТОГ всех сложностей
(в придачу к принципам SOLID)

Добавлено через 1 минуту
... а паттерны - это уже предпочтения дизайнера - исходя из проф.опыта...
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
03.07.2020, 09:00  [ТС]
отметила в теме Лучшие ответы по теме - 4-й отметить не могу (видимо есть лимит) - оставлю линком на #103
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
свести это задачу к более универсальной - к обработчику очереди задач.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.07.2020, 09:00

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
320
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
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