Я не стал ждать 3 дня, как мы говорили, но как-то это не сильно помогло… Мне не очевидно почему мой Принт работает, а из паскаля нет: как может не быть того объекта, который я только что выводил. Не говоря уже про Рандом и использование принта из паскаля как метода расширения…
Давайте, я буду подсказывать.
-
Метод расширения Print определен в паскалевском пространстве имён PABCSystem_implementation______
-
В модуле PABCSystem есть раздел инициализации. Он инициализирует датчик случайных чисел в частности. Чтобы его запустить, в программе на C# надо вызвать __InitModule();
После этого всё заработает
Забавно то, что в ходе экспериментов Rider самостоятельно подтянул PABCSystem_implementation______, а студия упорно продолжала жаловаться на проблемы с кодировкой.
А какие проблемы с кодировкой? У меня вроде не было
С инициализацией модуля ещё понятно, что механизм такой. А вот с подключением PABCSystem_implementation______ совсем непонятно: почему Print не работает, он же тоже указан в PABCSystem? Почему нужен дополнительно PABCSystem_implementation______?
По какому принципу методы распределены по PABCSystem_implementation______ и PABCSystem ? Некоторые, как Print, повторяются…
Ну и зачем такое кол-во нижних подчёркиваний?
P.S. Движок форму почему-то считает себя умнее и убирает мои сделанные намеренно переходы на новую строку, если после них не стоит пустая строка…
Никто не планировал подключать dll к C#. Теперь надо будет подумать, как это улучшить.
Print - это метод расширения, который указан в секции реализации PABCSystem - в секции интерфейса его нет. Те, которые указаны в разделе интерфейса - там даны только заголовки, а реализация - в разделе реализации.
В процессе выполнения лабораторных выяснилось, что для нормального использования кортежей, которые мы с вами так любим, необходим .NET Framework 4.7+, в то время как в дисплейных классах последняя версия - 4.6.1 (говорят, в некоторых даже 4.5), как-то неприятно… Станислав Станиславович, у вас есть какая-то возможность повлиять на скорость обновления VS в дисп. классах?
Нет. Я использую те возможности, которые есть у меня: рассказываю вам современный язык
Станислав Станиславович, можете, пожалуйста, выложить презентацию или раздаточный материал с сегодняшней лекции
Презентация по регулярным выражениям https://drive.google.com/file/d/1Bt6SkfDzYEer5BTTBK-8_8evUzBSnwhr/view?usp=sharing
Станислав Станиславович, пожалуйста, опубликуйте презентацию о Файлах.
Вот ссылка на папку, где будут появляться все используемые презентации https://drive.google.com/drive/folders/1bcJ4Fdx2JBlq6A1RXPZiKjPQp7kfxZyG?usp=sharing
В последней презентации по файлам в коде
for (int i=0; i<len; i++)
{
var x = br.ReadDouble();
bw.Seek(-sizeof(double), SeekOrigin.Current);
bw.Write(x * x);
}
нет ошибки. Binary Readers не имеют своей Position, а пользуются Position базового потока FileStream. Поэтому когда BinaryReader меняет позицию файлового указателя, для BinaryWriter она тоже меняется. И надо вернуться на один шаг назад. Это как раз и делает
bw.Seek(-sizeof(double), SeekOrigin.Current);
Станислав Станиславович, помните у меня был вопрос по работе модификатора This и его отличиях от ref? Я наконец-то собрался выложить код - https://pastebin.com/CUaSfjAi
Вопрос: Как, не ломая код вида arr.ChangeMem();
, получить в последней строчке то же, что и во второй?
Ага. Это называется "метод расширения" Я на лекциях буду рассказывать об этом позже. Возможно, уже скоро.
Видимо, ответ “никак”. Принципиально я говорил, что массивы не используются в задачах, где надо перевыделять память - в них используются List
Конкретно: у Вас глубинная ошибка в коде
public static void ChangeMem(this int[] a)
{
Array.Resize(ref a, a.Length + 1);
Вы вызываете a.ChangeMem() и в этом коде меняете a! Это не сработает - поменяется копия a и Вы её потеряете.
Как раз List является обёрткой над массивами и там это делается внутри. Если хотите сделать что-то подобное, потребуется массив инкапсулировать в класс типа List и в нём вызывать метод ChangeMem, которыый будет полностью менять внутренний массив
Спасибо за развёрнутый ответ. Я понимаю, что это методы расширения и ошибка сознательная для демонстрации того, что я хочу. Думаю, раз адекватных решений нет, то лучше просто не делать подобные вещи методами расширения.
Столкнулся с проблемой при решении домашнего задания по регулярным выражениям.Надо из строки найти все IPv4-адреса и записать в новую строку.Я не так создал регулярное выражение или что- то другое? Сам код вот:
0-255 - это неверно
Спасибо за подсказку. Вот это у меня получилось в конце. Работает
@"((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)"
Добавил презентацию по классам и АТД. Добавил исходники презентаций