ФИИТ 1 курс. Языки программирования. C#

Я не стал ждать 3 дня, как мы говорили, но как-то это не сильно помогло… Мне не очевидно почему мой Принт работает, а из паскаля нет: как может не быть того объекта, который я только что выводил. Не говоря уже про Рандом и использование принта из паскаля как метода расширения…

Давайте, я буду подсказывать.

  1. Метод расширения Print определен в паскалевском пространстве имён PABCSystem_implementation______

  2. В модуле 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 в дисп. классах?

Нет. Я использую те возможности, которые есть у меня: рассказываю вам современный язык

3 лайка

Станислав Станиславович, можете, пожалуйста, выложить презентацию или раздаточный материал с сегодняшней лекции

Презентация по регулярным выражениям https://drive.google.com/file/d/1Bt6SkfDzYEer5BTTBK-8_8evUzBSnwhr/view?usp=sharing

1 лайк

Станислав Станиславович, пожалуйста, опубликуйте презентацию о Файлах.

Вот ссылка на папку, где будут появляться все используемые презентации 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?)"

Добавил презентацию по классам и АТД. Добавил исходники презентаций