Ошибки PascalABC.NET

Ведущий разработчик вообще считает, что использование with в PABC 3.x - анахронизм на грани фола. Об этом уже писалось.

Можно запретить использовать шаблоны с with но “нельзя преобразовать к T” это не правильно.

Да, не спорю - там - ошибка. With реализовывалась очень рано - для совместимости, потом когда появились женерики - не особо тестировалась с ними, потому что стоит только начать… Там по-существу надо вообще запрещать использование with с женериками

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

à propos, не заметили, что Вас постепенно пытаются раскрутить реализовать полноценный аналог С# в Паскале?

Заметил конечно - но это давно уже пытаются. C# - хороший язык :slight_smile:

1 лайк

запретил к шутам.

Здравствуйте! Опять я со своими указателями :smile: . Про эту проблему рассказывал давно, но не приводил код, т.к. не мог точно определить источник. Собственно, проблема: явный указатель на Void не хочет создаваться, так как “Использование Void в текущем контексте недопустимо”, хотя объявление через Type PVoid=^Void; работает отлично.

Uses System;
Begin
Var a: Int32:=10;// Переменная
Var b: ^Void:=@a;// Указатель
Var c:=^Byte(^Void(Int32(b)+1));// Ошибка
End.

Ещё один баг кроется тут:

Type PVoid = ^Void;
Var v:=^Byte(PVoid(10));

Компилятор ругается на невозможность преобразования Pointer в Byte(!). То есть он(компилятор) не видит ^ перед Byte. Судя по всему, это следствие той же ошибки, что и в первом примере, так как использование типа Void не допустимо, в то время как использование указателя на него необходимо. И это доказывает вышеприведённое предположение о ^. И ещё один баг, связанный с лямбдами(на смысл кода не обращаем внимания, это просто пример):

Uses System;
Uses System.Threading;
Uses System.Threading.Tasks;
type
  PVoid = ^Void;

type
  PByte = ^Byte;

begin
  Parallel.For(0, 10, Procedure(y)-> begin
      var v := PByte(PVoid(y));
    end);
end.

Тут компилятор выдаёт вообще непонятную для меня ошибку: “В данной версии компилятора не поддерживается замыкание данного типа символов”. При этом, если убрать лямбду, все ошибки разом исчезают и код работает нормально.

  1. ^Void в паскале не пишут, используют pointer. И кстати в стандартном модуле есть PByte, PInteger и т.п.

  2. Возможно ^byte должно быть 1 словом, то есть PByte. Ещё форматирование съедает ^@admin ^byte(pointer) нормально писать, или надо обязательно PByte(pointer)?

  3. “В данной версии компилятора не поддерживается” - в этой части всё понятно. А “замыкание данного типа символов” переводится в 1 слово - “такое”. Только первый вариант формальный а второй нет. Ну и да, всё правильно, слово “такое” ничего не объясняет, так и задумано :wink:. Это общая ошибка которая выдаётся для всего что ещё не реализовали, и обычно она встречается в лямбдах.

Про это я знаю, но есть несколько моментов: 1) Люблю явные типы(указатель-значит ^); 2) А если это моя структура? Без труда можно представить ситуацию, когда, например в модуле, есть какая-то структура, указатель на которую является например, полем класса, при этом объявлять отдельный тип указателя не нужно. Тут тупик: нет явного(прямого) объявления в коде, нет модификатора доступа для типа. 2.

Опять таки, это не ошибка в синтаксисе Паскаля-это ошибка в реализации. PByte, возможно, для кого-то и удобнее, но возможность прямого использования типа указателя должна быть. У меня форматирование не съедает ^. 3. Это уже вопрос к Админам.

Да

Неадекватное сообщение об ошибке при:

begin
  var A := List&<integer>;
end.

Текст ошибки: () : Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :‘System.Exception: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(var_def_statement _var_def_statement) в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(var_statement node) в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st) в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list) в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st) в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code) в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block) в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module) в PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List1 ErrorsList, List1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging) в PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit) в PascalABCCompiler.Compiler.Compile()’

Как сделать так, чтобы при нажатии правой кнопки мыши по коду на C# в PABC.Net:

using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            Console.WriteLine("Hello World!");

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

не вылетало: Подробная информация об использовании оперативной (JIT) отладки вместо данного диалогового окна содержится в конце этого сообщения.

************** Текст исключения ************** Не могу выбрать подходящий парсер для файла ‘test.cs’

Однако синтаксис странный у вас)))

  1. Почему при:

    type TBase = class Value1: T;

     constructor(value1_: T);
     begin
       Value1 := value1_;
     end;
    

    end;

    TEntity = class(TBase) Value2: T;

     constructor(value1_, value2_: T);
     begin
       inherited Create(value1_);
       Value2 := value2_;
     end;
    

    end;

    begin var A := new TEntity(10, 20); end.

Вылетает ошибка:

Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :‘System.Exception: System.ArgumentException: Заданный конструктор должен быть объявлен в определении базового типа. Имя параметра: constructor в System.Reflection.Emit.TypeBuilder.GetConstructor(Type type, ConstructorInfo constructor) в PascalABCCompiler.NETGenerator.ILConverter.ConvertCommonGenericInstanceTypeMembers(ICommonGenericTypeInstance value) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles) в PascalABCCompiler.Compiler.Compile()’

?

  1. Почему при:

    type TBase = auto class Value1: T; end;

    TEntity = auto class(TBase) Value2: T; end;

    begin var A := new TEntity(12); end.

Вылетает: Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :‘System.Exception: System.ArgumentException: Заданный конструктор должен быть объявлен в определении базового типа. Имя параметра: constructor в System.Reflection.Emit.TypeBuilder.GetConstructor(Type type, ConstructorInfo constructor) в PascalABCCompiler.NETGenerator.ILConverter.ConvertCommonGenericInstanceTypeMembers(ICommonGenericTypeInstance value) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles) в PascalABCCompiler.Compiler.Compile()’

Еще. Например, при:

type
  TProperty<T> = class(System.IEquatable<TProperty<T>>)
  public 
    Value: T;
    
    constructor(value_: T);
    begin
      Value := value_;
    end;
    
    function Equals(prop: TProperty<T>) := Value.Equals(prop.Value);
  end;

begin
  var P := new TProperty<integer>();
  P.Value := 1;
end.

Вылетает ошибка: System.ComponentModel.Win32Exception (0x80004005): Указанный исполняемый файл не является действительным приложением для этой операционной системы. Однако, если закомментировать: {(System.IEquatable<TProperty>)}, то все нормально.

У меня не компилируется выдавая нормальную ошибку, откуда T? если это шаблон - почему это не указан в названии класса и какой тип должен быть у него при создании A.

Тот же вопрос.

А это вообще компилируется нормально.

  1. У вас последняя версия? Последнее что вы написали похоже на то что недавно исправили.

  2. Чтобы код выглядел нормально ставьте ``` перед и после него.

```

type

t1=class

end;

```

Станет

type

t1=class

end;

Этот знак находится под ё в англ. раскладке. Так же для кода на 1 строчку можно ставить по 1 такому знаку: `{(System.IEquatable)}` превращается в {(System.IEquatable<TProperty>)}.

1 лайк

У меня 3.3.1634. T у меня там был при вставке кода, куда он пропал - я без понятия.

И спасибо за рекомендации - на будущее учту. :slight_smile:

Есть код:

type
  TPoint = class
    _X, _Y: integer;
    
    constructor (x_, y_: integer);
    begin
      (_X, _Y) := (x_, y_);
    end;
    
    function ToString() := Format('({0}, {1})', _X, _Y);
  end;

begin
  var A := ReadlnString().ToWords().Pairwise().Select(x -> new TPoint(StrToInt(x.Item1), StrToInt(x.Item2)));
  A.ToArray()[0].ToString().Println();
end.

Но почему когда навожу курсор на A, то ее тип отображается как sequence of Tuple<char, char>? Почему не sequence of TPoint?

Ну понятно, браузер воспринял <T> как команду HTML-a. Выполнить не смог - поэтому просто проигнорировал.