Ошибки PascalABC.NET

assert используется в программах для тестирования паскаля, чтоб когда разработчики добавляют фичу - проверить не сломала ли она что то. Вот к примеру, это вроде последний добавленный такой файл. System.Diagnostics.Debug.Assert должна работать понятнее.

Для чего он - знаю, а вот как работает? Может он только в консольных приложениях работу программы прерывает, а в оконных его использовать вообще нельзя? Или я что-то делаю не правильно…

Откройте реализацию assert в PABCSystem. Для этого достаточно написать assert и нажать ПКМ, перейти к реализации(предварительно открыв PABCSystem).

Естественно, в Паскале это реализовано на стандартных .NET библиотеках. Там внутрях вызовы System.Diagnostics.Debug.Assert, как и ожидалось… То есть, надо лезть в офф. документацию. Вообще хотел услышать что-то вроде “assert нужно использовать только так и так, а в этом случае нельзя” или, что это глюк компилятора.

Ну я ж и говорю PABCSystem.assert скорее внутренняя… Она не по каким то стандартам работает а как удобней было бы для тестирования паскаля.

Что такое РазмерКнопок, ОтступОтКнопок? Поля, свойства, методы? В них где-то и падает наверно.

Свою ошибку уже исправил… этот кусок кода в методе, который находился конструкторе. Думал, что при ошибке assert остановит программу, и выведет окошко с сообщением об ошибке. Но он оборвал выполнение не только метода, в котором находился, но и всех внешних. Поэтому экземпляр класса не был создан, и выдало соответствующую ошибку.

Постарайтесь чтобы воспроизводилось. Может, у Вас компьютер с вирусами или антивирусом, который всё гасит, а мы гадать будем

Трудно сказать. Assert - действительно простой вызов функции из .NET-библиотеки. В оконных программах, особенно многопоточных, может работать не так как ожидалось. Я бы пользовался стандартной обработкой исключений

Ну вот на новеньком ноуте этот глюк возник на Вин10 - написал сюда. На счёт антивируса, точно сказать не могу. Каспер ни саму среду не гасит, ни получившиеся программы(в отличие, например, от аваста). Этот глюк у меня появляется редко, но уже был замечен на трёх компах… Постараюсь воспроизвести.

Нужно понять хотя бы, в каких условиях возникает ошибка и что общего между ошибками.

Поначалу мне казалось, что это ошибка с IntelliSense - когда компилятор падает после нажатия точки - но, помнится, были случаи и без точки падал(хотя приведённый пример как раз такой). По-моему, это два разных глюка, и конкретно этот возникает исключительно после ошибки компиляции.

А может стоит сделать билд с более подробным дебагом лично для этого случая, чтоб IDE не вылетала, а возвращала точку ошибки?

Вроде бы default(имя_записи) должно давать переменную заполненную значениями по умолчанию, но им даёт нулевые значения вместо этого, это ошибка?

type
  t1=class
    
    public a := new byte[0];
    public b := 5;
    
  end;
  t2=record
    
    public a := new byte[0];
    public b := 5;
    
  end;

begin
  writeln(new t1);
  writeln(new t2);
  writeln(default(t2));
  var a:t2;
  writeln(a);
end.
([],5)
(nil,0)
(nil,0)
([],5)

Если IDE вылетает, то билды не помогут

Справка -> обобщённые типы -> ограничения на параметры обобщённых подпрограмм и классов: “Можно также использовать присваивание переменной, имеющей тип параметра обобщенного класса или подпрограммы, значение по умолчанию, используя конструкцию default(T) - значение по умолчанию для типа T (nil для ссылочных типов и нулевое значение для размерных типов):”

Нет, значение по умолчанию - это все поля прописываются нулями. Это не C++. В C# вообще запрещено инициализировать поля структур как у нас. Поэтому считайте особенностью реализации.

В таком случае нельзя ли как то сделать перезагрузку default? Нулевое значение не обязательно значит что во всех параметрах нули.

begin
  2**7
end.

Тут всё ясно.
Но не компилятору: () : Встречено ’


Так должно работать?

begin
  2**7.step.Print
end.

" () : Встречено ’ "


А со скобками?

begin
  (2**7).step.Print
end.

" Program1.pas(2) : Неизвестное имя ‘Print’ "


begin
  (2**7).step()
end.

Тут “Program1.pas(2) : Неверное количество параметров функции”, хотя IntelliSense показывает вариант без параметров, так работает:

begin
  (2**7).step(1)
end.

begin
  (2**7).step(1).Print
end.

нет, нельзя