Ошибки PascalABC.NET

Очень часто бывает, что “Ошибка времени выполнения: Индекс находился вне границ массива.” указывает на операторные скобки (begin). С чем это может быть связано? 7ml2xoxIo_8

Смотрите на следующую или предыдущую строчку, вроде все .Net языки имеют свойство время от времени промахиваться со строчкой ошибки.

Itellisence не понимает список, полученный из строки. 2018-02-20_100947

12 сообщений перенесены в новую тему: Ошибки, происходящие от незнания различия между Read и Readln

Нельзя раширять операции +,+=,-,-= для делегатов

Зачем это ограничение?

По той же причине, почему нельзя расширить эти операции для integer

В смысле? Для integer их можно расширять.

специальные операции для делегатов, не имеющие ничего общего с арифметическими. их нельзя расширять.

Хотел спросить. Почему не работает это:

type
  T1<T> = class
    event E1: procedure;
    
    procedure TryE1();
    begin
      if E1 <> nil then E1();
    end;
  end;

begin
  var Obj := new T1<integer>();
  Obj.E1 += Halt;
  Obj.TryE1();
end.

?

Это так же самая ошибка что и тут?

1 лайк

Да, та же самая. Прошу исправить данный баг как можно скорее поскольку сильно мешает нормальному написанию кода. Заранее благодарен.

Почему ругается на строку 18: Program142.pas(18) : Нельзя преобразовать тип MyType к object?

type
  TEventArgs = class
  // Содержимое
  end;

type
  TEventArgsHandler = procedure(sender: object; e: TEventArgs);

type
  MyType<T> = class(System.IEquatable<MyType<T>>, System.ICLoneable)
  public 
    Value: T;
    
    event Event1: TEventArgsHandler;
    
    procedure TryEvent1();
    begin
      if Event1 <> nil then Event1(self, new TEventArgs());
    end;
    
    function Equals(obj: MyType<T>) := true;
    
    function Clone(): object := self; // Заглушка
  end;

procedure H(sender: object; e: TEventArgs) := WriteLn('Hello world!');

begin
  var O1 := new MyType<integer>();
  O1.Event1 += H;
  O1.TryEvent1();
end.

Но если уберу скобки и имена интерфейсов - все нормально.

1 лайк

Жду исправлений.

Кажись, новый баг нашел: если написать:

//uses System;
const
  Path = 'C:\Файлы\Уроки\Алгоритмизация\Вариант 511.txt';

type
  ///Тип детали.
  TDetail = record
  private 
    _Name: string;
    _Weight: integer;
    _IsPresent: boolean;
  
  public 
    ///Имя
    property Name: string read _Name write _Name;
    ///Вес
    property Weight: integer read _Weight write _Weight;
    ///Состоянее
    property IsPresent: boolean read _IsPresent write _IsPresent;
    
    constructor(name_: string; weight_: integer; isPresent_: boolean);
    begin
      Name := name_;
      Weight := weight_;
      IsPresent := isPresent_;
    end;
    
    ///Возвращает строковое представление объекта типа TDetail.
    function ToString() := Format('Detail: (Name: {0}, Weight: {1}, State: {2}).', _Name, _Weight, _IsPresent);
  end;

begin
  var Details := ReadAllLines(Path).Select(x ->  
                                                begin
                                                  var l := x.ToWords();
                                                  try
                                                    Result := new TDetail(l[0], StrToInt(l[1]), l[2] = 'true')
                                                  except on System.FormatException do
                                                    Writeln('Ошибка: неверный формат входных данных.');
                                                  end;
                                                end);
                                  
  Details.Where(x -> (x.Weight > 10) and (x.Weight < 50)).Select(x -> x.ToString()).JoinIntoString(NewLine).Println();
  Details.Where(x -> not x.IsPresent).Select(x -> x.ToString()).JoinIntoString(NewLine).Println();
end.

Неожиданное: Вариант 511.pas(38) : В данной версии компилятора не поддерживается замыкание данного типа символов, однако если раскомментировать строку 1, то все работает.

Вот вариант без лишнего, только давайте вы сами попробуете лишнее убрать в следующий раз:

//uses System;//если раскомментировать - ошибки нет

begin
  var a: ()->() := ()->
  try
  except
    on System.InvalidCastException do//любой исключение из system
  end;
end.

@Admin это ошибка или нет? Может хотя бы сделать более информативно?

1 лайк

Хорошо, в следующий раз буду убирать лишнее.

Это не ошибка. К сожалению, это слабый алгоритм анализа нелокальных имён в лямбдах, которые лямбда естественно хочет захватить. Для всего, что алгоритм не может отклассифицировать, он выдаёт ошибку об имени, которое не может захватить. Информативнее это сделать трудно - этот алгоритм и так сложный - и как раз если бы он знал, что такое System на тот момент, то и код бы сгенерировал. Когда Вы пишете uses, это ему подсказка, и он классифицирует System.

1 лайк

А можете улучшить алгоритм анализа? Я понимаю, что нелегко - но хотя бы попытаться же можно и при удачной попытке обновление сделать PABC.Net. Текст ошибки не очень информативный, кстати: В данной версии компилятора не поддерживается замыкание данного типа символов.

@Admin так а всё же, вы сказали что эти операторы нельзя расширять для integer хотя их можно, и по аналогии с делегатами это следовало бы запретить. То что следующий код компилируется это ошибка?

function operator+(i1, i2: integer): integer; extensionmethod;
begin end;

function integer.operator*(i1, i2: integer): integer;
begin end;

begin end.

С++ вот к примеру запрещает перезагружать операторы 2 вшитыми типами, даже если это новая пара (как int и double).

1 лайк