С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
2 / 2 / 2
Регистрация: 14.03.2017
Сообщений: 124

Почему оператор lock () предназначен только для ссылочных типов?

06.07.2019, 12:25. Показов 8252. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему оператор lock () предназначен для приема только параметров ссылочного типа?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.07.2019, 12:25
Ответы с готовыми решениями:

Почему оператор lock() предназначен для принятия параметров только ссылочного типа?
Почему оператор lock() предназначет для принятия параметров только ссылочного типа?

Каким образом выполняется оператор "+" для ссылочных типов, если один из операндов равен null
Вопрос может показаться странным, но все же хотелось бы получить ответ. 1) Каким образом выполняется оператор "+" для...

ArrayList для ссылочных типов
Здравствуйте. Правда ли, что при наполнении ArrayList ссылочными типами, то операции boxing/unboxing не выполнятся. Тем самым можно не...

23
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 12:33
Кирилл2017, потому что только у объектов размещенных на куче есть SyncBlock, по которому, собственно, и производится контроль доступа потоков в критическую секцию.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.07.2019, 16:28
Цитата Сообщение от Cupko Посмотреть сообщение
потому что только у объектов размещенных на куче есть SyncBlock, по которому, собственно, и производится контроль доступа потоков в критическую секцию.
Этот ответ напрашивается на встречный вопрос: почему тогда у значимых типов нет этого блока?

Так же стоит обратить внимание, что lock — это конструкция конкретно языка C#, а не .NET или среды выполнения CLR, а спек как раз не накладывает никаких условий на то, как синхронизация должна быть реализована рантаймом: с блоком синхронизации в заголове объекта или с использованием отдельной таблицы замыкания — это каждая среда может реализовывать по-своему.
Так что в контексте языка ваш ответ, к сожалению, неправильный.

Вот что правила языка четко указывают, так это то, во что блок lock должен разворачиваться, а именно в такую конструкцию:
C#
1
2
3
4
5
6
7
8
bool __lockWasTaken = false;
try {
   System.Threading.Monitor.Enter(x, ref __lockWasTaken);
   ...
}
finally {
   if (__lockWasTaken) System.Threading.Monitor.Exit(x);
}
С той разницей, что x вычисляется только один раз.

Ну а поскольку методы Monitor.Enter и Monitor.Exit для замыкания принимают на вход переменную типа object, постольку попытка синхронизироваться на значимом типе не имеет смысла, т.к. при каждом вызове Enter и Exit будет производиться запаковка и как результат синхронизация будет проводиться каждый раз на новом экземпляре (а попытка вызова Exit вообще приведет к исключению).

Что характерно, при прямом вызове Monitor.Enter с передачей туда значимого типа, никакой ошибки не возникает, просто такой вызов не имеет смысла.

Однако я ни разу не удивлюсь если в будущих версиях фреймворка, а в будущем и языка, появится новая перегрузка Monitor.Enter/Exit, позволяющая замыкаться и на значимых типах:
C#
1
2
public static void Enter<T>(ref T obj) where T : struct;
public static void Exit<T>(ref T obj) where T : struct;
3
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 19:47
Цитата Сообщение от kolorotur Посмотреть сообщение
Этот ответ напрашивается на встречный вопрос: почему тогда у значимых типов нет этого блока?
Тогда вам встречный вопрос: почему у значимых типов отсутствует Object Type Pointer заголовок, и есть ограничения на наследование и полиморфизм?
Цитата Сообщение от kolorotur Посмотреть сообщение
Так же стоит обратить внимание, что lock — это конструкция конкретно языка C#, а не .NET или среды выполнения CLR, а спек как раз не накладывает никаких условий на то, как синхронизация должна быть реализована рантаймом: с блоком синхронизации в заголове объекта или с использованием отдельной таблицы замыкания — это каждая среда может реализовывать по-своему.
О каких разновидностях рантайма идет речь? И где это организовано по-другому?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.07.2019, 19:59
Цитата Сообщение от Cupko Посмотреть сообщение
почему у значимых типов отсутствует Object Type Pointer заголовок
Это надо спрашивать у создателей рантайма. Язык этот момент никак не регламентирует.

Цитата Сообщение от Cupko Посмотреть сообщение
и есть ограничения на наследование и полиморфизм?
Потому что в переменных значимых типов хранится экземпляр.
Если разрешить полиморфизм, то сколько памяти выделять под эту переменную?

Цитата Сообщение от Cupko Посмотреть сообщение
О каких разновидностях рантайма идет речь?
Да о любых.
Можете хоть свою реализацию писать для какого-нибудь Линупса и работать с памятью как заблагорассудится. До тех пор, пока эта работа не противоречит спеку.

Цитата Сообщение от Cupko Посмотреть сообщение
где это организовано по-другому?
Понятия не имею, я в детали реализации рантаймов не особо лезу.
Суть комментария была в том, что этот вопрос отдается на откуп среде выполнения и как-то странно деталь реализации какого-то определенного называть причиной наличия какого-то правила в языке.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 20:05
Цитата Сообщение от kolorotur Посмотреть сообщение
Потому что в переменных значимых типов хранится экземпляр.
Если разрешить полиморфизм, то сколько памяти выделять под эту переменную?
На размер того самого Object Type Pointer больше?
Может это и есть ответ на ваш встречный вопрос?

Нет, вы не думайте, что я тут докопаться решил. Просто я реально не понимаю, что написано в вашем длинном сообщении, и чем это противоречит тому, что написал я.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.07.2019, 20:15
Цитата Сообщение от Cupko Посмотреть сообщение
На размер того самого Object Type Pointer больше?
Как же потом этой переменной присвоить значение экземпляра унаследованного класса с десятью дополнительными полями?
Память-то уже выделена под размер экземпляра родительского типа.
И мы еще даже не начали обсуждать передачу таких переменных в методы: какого размера должен быть фрейм вызова?

Цитата Сообщение от Cupko Посмотреть сообщение
Может это и есть ответ на ваш встречный вопрос?
Неа, добавить памяти для блока синхронизации как раз не так-то сложно. Рантайм уже это делает, когда изменяет размер структуры под выравнивание в памяти, добавить дополнительные 4 байта не проблема.

Цитата Сообщение от Cupko Посмотреть сообщение
вы не думайте, что я тут докопаться решил.
Да бросьте.
Докапывайтесь чаще и тщательнее — это всем только на пользу.

Цитата Сообщение от Cupko Посмотреть сообщение
я реально не понимаю, что написано в вашем длинном сообщении, и чем это противоречит тому, что написал я.
Если вкратце, то причина запрета синхронизироваться на значимых типах не в наличии или отсутствии блока синхронизации, а в отсутствии обобщенных типов в первой версии языка и в невозможности делать это без запаковки, что на корню лишает смысла саму синхронизацию.
Если спек требовал бы наличия такой возможности, то поменялась бы реализация рантайма.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 20:25
Цитата Сообщение от kolorotur Посмотреть сообщение
Как же потом этой переменной присвоить значение экземпляра унаследованного класса с десятью дополнительными полями?
Память-то уже выделена под размер экземпляра родительского типа.
Пройти по ссылке в хедере в таблицу методов и получить размер всех филдов?
Цитата Сообщение от kolorotur Посмотреть сообщение
И мы еще даже не начали обсуждать передачу таких переменных в методы: какого размера должен быть фрейм вызова?
Тут я не могу ответить, ибо моих познаний платформы не хватает чтоб ваш вопрос понять
Цитата Сообщение от kolorotur Посмотреть сообщение
Если вкратце, то причина запрета синхронизироваться на значимых типах не в наличии или отсутствии блока синхронизации, а в отсутствии обобщенных типов в первой версии языка и в невозможности делать это без запаковки, что на корню лишает смысла саму синхронизацию.
Нет, подождите, конкретно CLR в конкретном .NET использует SyncBlock для этого, так ведь? Поэтому отсутствие этого блока и ссылки на него в хедере делает как раз таки невозможным синхронизацию на значимых объектах, разве нет?
Цитата Сообщение от kolorotur Посмотреть сообщение
Если спек требовал бы наличия такой возможности, то поменялась бы реализация рантайма.
С этим всё понятно, я мыслю в масштабах конктретно классического .NET-фреймворка.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.07.2019, 20:54
Цитата Сообщение от Cupko Посмотреть сообщение
Пройти по ссылке в хедере в таблицу методов и получить размер всех филдов?
В какой момент это делать?
Память-то под переменную выделяется во время объявления этой переменной!
Ну например:
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
// Размер экземпляра — 4 байта
struct Base
{
   int a;
}
 
// Размер экземпляра — 12 байт
struct Derived : Base
{
   int b, c;
}
 
void Foo()
{
   Base x = new Base(); // Сколько байт выделять под переменную? Base занимает 4 байта, значит 4?
 
   x = new Derived(); // А теперь в уже выделенную ячейку памяти в 4 байта надо записать 12 байт. Что делать?
 
   x = Bar(); // А тут как поступить?
}
 
Base Bar()
{
   var r = new Random();
 
   // Сколько памяти выделать под возвращаемое значение?
   return r.NextDouble() < 0.5 ? new Base() : new Derived();
}
Цитата Сообщение от Cupko Посмотреть сообщение
конкретно CLR в конкретном .NET использует SyncBlock для этого, так ведь?
Поэтому отсутствие этого блока и ссылки на него в хедере делает как раз таки невозможным синхронизацию на значимых объектах, разве нет?
В чертежах автомобиля колеса круглые — потому что завод не может квадратные производить?
Или все-таки производство подстраивается под конструкторскую задумку?
Конкретно в CLR в конкретном .NET нет блока SyncBlock в значимых типах потому, что он там не нужен, т.к. спецификация языка не позволяет использовать значимые типы для синхронизации.

Добавлено через 4 минуты
Cupko, или вы предполагаете, что в какой-то момент был уже готовый CLR и когда создавался язык C#, то его создатели столкнулись с таким ограничением в рантайме и изменили спек соответствующим образом?
Такое возможно, но хотелось бы какой-нибудь ссылки на первоисточник.
1
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 21:01
Цитата Сообщение от kolorotur Посмотреть сообщение
Память-то под переменную выделяется во время объявления этой переменной!
Возможно. Но что такое переменная по сути? Это жеж смещение указателя стэка, не? Куда девается ваши объекты после переназначения из стэка? почему перед добавлением в стэк таки не высчитывать это смещение через хедер? А при удалении не высчитывать его же таким же методом по указателю + 4 этих байта?
Я в этом вопросе, конечно, загрубил. Получилось бы явно некрасиво с массивами и филдами, как вы говорите. Но всё зависит от реализации, как вы говорите
Цитата Сообщение от kolorotur Посмотреть сообщение
Конкретно в CLR в конкретном .NET нет блока SyncBlock в значимых типах потому, что он там не нужен, т.к. спецификация языка не позволяет использовать значимые типы для синхронизации.
Конкретно в CLR в конкретном .NET нет блока Object Type Pointer в значимых типах потому, что он там не нужен, т.к. спецификация языка не позволяет использовать значимые типы для самоидентификации.

Добавлено через 48 секунд
Цитата Сообщение от kolorotur Посмотреть сообщение
Cupko, или вы предполагаете, что в какой-то момент был уже готовый CLR и когда создавался язык C#, то его создатели столкнулись с таким ограничением в рантайме и изменили спек соответствующим образом?
Нет, этого я не имею в виду, и не слышал ничего подобного.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.07.2019, 21:08
Цитата Сообщение от Cupko Посмотреть сообщение
Но что такое переменная по сути?
Это место в памяти, в которое вы можете записывать значение или его оттуда считывать.

Цитата Сообщение от Cupko Посмотреть сообщение
Это жеж смещение указателя стэка, не?
Оно, да.

Цитата Сообщение от Cupko Посмотреть сообщение
Куда девается ваши объекты после переназначения из стэка?
Значимых типов? Никуда не деваются, затираются при последующем использовании этого стэка.

Цитата Сообщение от Cupko Посмотреть сообщение
почему перед добавлением в стэк таки не высчитывать это смещение через хедер?
Потому что если разрешить наследование и полиморфизм, то до момента присваивания этой переменной значения размер этого смещения неизвестен, т.к. неизвестен фактический тип, который будет храниться в этой переменной.
А память нужно выделить до присваивания значения. Улавливаете? Память выделить нужно, а сколько выделять — неизвестно, т.к. значения с указателем на хедер ще нет.

Цитата Сообщение от Cupko Посмотреть сообщение
Конкретно в CLR в конкретном .NET нет блока Object Type Pointer в значимых типах потому, что он там не нужен, т.к. спецификация языка не позволяет использовать значимые типы для самоидентификации.
Совершенно верно.

Цитата Сообщение от Cupko Посмотреть сообщение
А при удалении не высчитывать его же таким же методом по указателю + 4 этих байта?
Все по той же причине: если разрешить полиморфизм значимых типов, то размер переменной значимого типа неизвестен до тех пор, пока в нее не будет записано значение.
А значение записать невозможно потому, что неизвестен размер переменной.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 21:18
Цитата Сообщение от kolorotur Посмотреть сообщение
Совершенно верно.
Я лишь это и хотел сказать
Цитата Сообщение от kolorotur Посмотреть сообщение
Потому что если разрешить наследование и полиморфизм, то до момента присваивания этой переменной значения размер этого смещения неизвестен, т.к. неизвестен фактический тип, который будет храниться в этой переменной.
А память нужно выделить до присваивания значения. Улавливаете? Память выделить нужно, а сколько выделять — неизвестно, т.к. значения с указателем на хедер ще нет.
Возможно вы правы, но для меня это не совсем логично звучит. Если взять, например, код:
C#
1
2
string s;
s = "hello";
Вы хотите сказать что память на ссылку выделяется в первой строчке? Т.е. push в стэк происходит при определении?
Со значимыми типами всё понятно, потому что их инициализировать не нужно и туда пойдут дефолтные значения.
Т.е. при
C#
1
2
int i;
i = 5;
будет push 0; pop; push 5;

Я к тому что, размер можно высчитывать при каждом push/pop и выделение памяти под переменную тут вообще не понятно причем.

На самом деле мы уже ерунду обсуждаем. Я понял ваш посыл. Надеюсь, вы поняли мой
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
06.07.2019, 21:41
Цитата Сообщение от Cupko Посмотреть сообщение
Вы хотите сказать что память на ссылку выделяется в первой строчке?
размер любой ссылки известен изначально и зависит лишь от архитектуры. обычно 32 или 64 бита. поэтому мы его и можем выделить, а куда он там будет указывать в кучу это нам все равно.
Цитата Сообщение от Cupko Посмотреть сообщение
Я к тому что, размер можно высчитывать при каждом push/pop и выделение памяти под переменную тут вообще не понятно причем.
это же стек поломает. (и еще много чего, но для примера стек)
если по адресу 4х байтовой структуры в стеке записать 32 байта, то мы скорее всего затрем кучу других данных. а в другое место записывать нельзя, потому что это стек
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.07.2019, 21:41
Цитата Сообщение от Cupko Посмотреть сообщение
Вы хотите сказать что память на ссылку выделяется в первой строчке?
Да.
Если копать в дебри деталей реализации рантайма, то по факту память под все локальные выделяется в самом начале метода, но семантически — при объявлении.

Цитата Сообщение от Cupko Посмотреть сообщение
Я к тому что, размер можно высчитывать при каждом push/pop и выделение памяти под переменную тут вообще не понятно причем.
Только в том случае, если при каждом определении и присваивании значений переменной производить этот push/pop, что не совсем хорошо и совсем плохо когда дело доходит до возвращаемых значений, параметров метода и прочих веселостей вроде передачи по ссылке.

Цитата Сообщение от Cupko Посмотреть сообщение
На самом деле мы уже ерунду обсуждаем.
Отошли малость от темы, ага
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
06.07.2019, 21:47
Цитата Сообщение от Cupko Посмотреть сообщение
Вы хотите сказать что память на ссылку выделяется в первой строчке?
Да. 4 байта в 32-разрядной операционной системе и 8 байт в 64-разрядной операционной системе.
Именно под ссылку. string - ссылочный тип.

Добавлено через 5 минут
Цитата Сообщение от Cupko Посмотреть сообщение
будет push 0; pop; push 5;
Абсолютно не факт. Мы не имеем право надеяться на это и верить этому.
Вроде Хейсберг говорил, код может выделять память как угодно, в том числе и в свободных регистрах процессора. На стек надеяться нет смысла.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 21:57
Цитата Сообщение от КОП Посмотреть сообщение
размер ссылки известен изначально и зависит лишь от архитектуры. обычно 32 или 64 бита. поэтому мы его и можем выделить, а куда он там будет указывать в кучу это нам все равно.
Да это и ежу понятно.
Цитата Сообщение от КОП Посмотреть сообщение
это же стек поломает. (и еще много чего, но для примера стек)
если по адресу 4х байтовой структуры в стеке записать 32 байта, то мы скорее всего затрем кучу других данных. а в другое место записывать нельзя, потому что это стек
Что вы имеете в виду под адресом 4х байтовой структуры в стэке?
Цитата Сообщение от kolorotur Посмотреть сообщение
Если копать в дебри деталей реализации рантайма, то по факту память под все локальные выделяется в самом начале метода, но семантически — при объявлении.
Ну так же можно выделять требуемую память в начале метода, высчитав предварительно требуемый (максимальный) размер
Ладно, господа, всё это чисто риторически. Мы обсуждаем абсолютно неважные вещи: что бы было, если бы.

Цитата Сообщение от amr-now Посмотреть сообщение
Абсолютно не факт. Мы не имеем право надеяться на это и верить этому.
Вроде Хейсберг говорил, код может выделять память как угодно, в том числе и в свободных регистрах процессора. На стек надеяться нет смысла.
Да что вы все имеете в виду под выделение памяти в стэке? это лишь перемещение его указателя.

Цитата Сообщение от amr-now Посмотреть сообщение
Да. 4 байта в 32-разрядной операционной системе и 8 байт в 64-разрядной операционной системе.
Именно под ссылку. string - ссылочный тип.
Вопрос был не в количестве байтов под ссылку, а про момент перемещения указателя в стэке.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
06.07.2019, 21:58
Cupko, имеется ввиду, что программист C# не имеет права угадывать, где у него в данную секунду будут находиться данные - в стеке, в регистрах процессора или вообще в куче.
Замыкания например в кучу переползают. Внезапно.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 22:03
amr-now, программист C# должен понимать где они находятся, дабы для него выполнение его кода не казалось магией.
Про замыкания речь отдельная, как и про делегаты.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
06.07.2019, 22:06
Cupko, в нашей профессии есть важный момент - если ты думаешь, что что-то понимаешь, то не факт, что на самом деле понимаешь.
Поэтому рассуждать о стеке нет смысла. Это не правда.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
06.07.2019, 22:09
amr-now, поэтому и есть ресурсы в виде этого форума. И я до сих пор здесь нахожусь только из-за того, что это помогает мне достичь понимания процессов в фреймворке.
Цитата Сообщение от amr-now Посмотреть сообщение
Поэтому рассуждать о стеке нет смысла. Это не правда.
Смысл, как раз, в рассуждениях. Стек - это не правда? Стек не работает как стек? там прямая адресация к объектам? что не правда то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.07.2019, 22:09
Помогаю со студенческими работами здесь

Особенность копирования данных для ссылочных типов
Доброго времени суток, всем. Ребят, как определить, что у ссылочного типа есть &quot;особенность&quot; при присваивании такого же типа,...

Для чего предназначен оператор ^
Доброго времени. Для чего предназначен оператор ^ в Паскале? Например, PGUID=^tGUID; if PByte 9DWORD (p1)+i)^ &lt;&gt; PByte...

Сравнение ссылочных типов
первый случай понятен , без явного приведения мы сравниваем одинаковое значения по разным ссылкам.(будет true) второй случай тоже...

Инкапсуляция ссылочных типов
Здравствуйте! Имеется такой класс (что-то вроде обёртки). public class ArrayWrapper { private int arr; //Constructor public...

Особенности использования ссылочных типов
Доброе время суток всем.Подскажите по поводу ссылочных типов ,я что то не могу понять.Есть кусок кода : private function...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru