Ну метки же запретили с лямбдами… ничего, все живы.
à propos, не заметили, что Вас постепенно пытаются раскрутить реализовать полноценный аналог С# в Паскале?
Ну метки же запретили с лямбдами… ничего, все живы.
à propos, не заметили, что Вас постепенно пытаются раскрутить реализовать полноценный аналог С# в Паскале?
Заметил конечно - но это давно уже пытаются. C# - хороший язык
Здравствуйте! Опять я со своими указателями . Про эту проблему рассказывал давно, но не приводил код, т.к. не мог точно определить источник. Собственно, проблема: явный указатель на 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.
Тут компилятор выдаёт вообще непонятную для меня ошибку: “В данной версии компилятора не поддерживается замыкание данного типа символов”. При этом, если убрать лямбду, все ошибки разом исчезают и код работает нормально.
^Void
в паскале не пишут, используют pointer
. И кстати в стандартном модуле есть PByte
, PInteger
и т.п.
Возможно ^byte
должно быть 1 словом, то есть PByte
. Ещё форматирование съедает ^
… @admin ^byte(pointer)
нормально писать, или надо обязательно PByte(pointer)
?
“В данной версии компилятора не поддерживается” - в этой части всё понятно. А “замыкание данного типа символов” переводится в 1 слово - “такое”. Только первый вариант формальный а второй нет. Ну и да, всё правильно, слово “такое” ничего не объясняет, так и задумано . Это общая ошибка которая выдаётся для всего что ещё не реализовали, и обычно она встречается в лямбдах.
Про это я знаю, но есть несколько моментов: 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, List
1 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’
Однако синтаксис странный у вас)))
Почему при:
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()’
?
Почему при:
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
.
Тот же вопрос.
А это вообще компилируется нормально.
У вас последняя версия? Последнее что вы написали похоже на то что недавно исправили.
Чтобы код выглядел нормально ставьте ``` перед и после него.
```
type
t1=class
end;
```
Станет
type
t1=class
end;
Этот знак находится под ё в англ. раскладке. Так же для кода на 1 строчку можно ставить по 1 такому знаку: `{(System.IEquatable)}` превращается в {(System.IEquatable<TProperty>)}
.
У меня 3.3.1634. T у меня там был при вставке кода, куда он пропал - я без понятия.
И спасибо за рекомендации - на будущее учту.Есть код:
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. Выполнить не смог - поэтому просто проигнорировал.
type
I1<T>=interface
function f1: T;
end;
I2 = interface
function f1: object;
end;
C1<T>=class(I1<T>, I2)
a: T;
public
function f1: T := a;
function f1: object := a;
end;
begin end.
В классе C1 получается невозможно реализовать оба интерфейса. Я лично с этим столкнулся в ситуации с System.Collections.IEnumerable
и System.Collections.Generic.IEnumerable
, функция get_Current
. Получается написать класс - полноценную последовательность - невозможно. Правда я не представляю как это исправить.
Ну почему сразу в ошибки паскаля. Здесь надо явно реализовывать интерфейсы.
Ну так реализуйте, напишите как. Вот на гитхаб это не правильно сразу сувать потому что возможно есть способ написать что то типа:
type
I1<T>=interface
function f1: T;
end;
I2 = interface
function f1: object;
end;
C1<T>=class(I1<T>, I2)
a: T;
public
function I1.f1: T := a;
function I2.f1: object := a;
end;
begin end.
То есть явно указать функцию какого интерфейса реализовываем. Если бы вы посмотрели на пример внимательно - увидите что я явно реализовал оба интерфейса, но компилироваться это не хочет, потому что Program1.pas(16) : Повторное объявление
на строчке реализации второй f1
.