Ошибки PascalABC.NET

У нас на форуме есть замечательная штука из markdown - выделение при помощи символа “`” строки кода или при помощи “```” многострочного кода. Подробнее можно прочесть, например, здесь или погуглить “выделение кода markdown”. Позволяет не танцевать с экранированием символов.

type
  c1 = class
    constructor create;
    begin
      var a := new real[2](3.1, 3.7);
      writeln(a.Select(b -> Round(b)));
    end;
  end;

begin
end.
function Select<T1, T2>(a: array of T1; selector: T1->T2): System.Collections.Generic.IEnumerable<T2>;
begin
  Result := a.Select(selector);
end;

type
  c1 = class
    constructor create;
    begin
      var a := new real[2](3.1, 3.7);
      writeln(Select(a, b -> Round(b)));
    end;
  end;

begin
end.
1 лайк

или же BB-Code [CODE]writeln(a,b);[/CODE]

Эта ошибка связана с наличием в теле конструктора лямбда-выражения. Исправим

в классовых процедурах и функциях не получается указывать nil как значение по умолчанию

  type
    b = record
    end;
    a = class
      class procedure aa(i: integer; nb: ^b := nil);
      begin
      end;
    end;

   begin
     a.aa(0);
   end.

Да, увидели

4 сообщения перенесены в новую тему: Текстуры не работают

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

это я то что удалось запечатлел, но там такое происходит… куски кода вообще рандомно разбросаны повсюду, когда тыкаешь на определённый строчки они меняются на другие и назад, в общем когда много кода, много свёрнутых частей - при Ctrl+X и Ctrl+V, и просто при написании кода, когда паскалю нормально не получается проверить где сворачиваемый код - он начинает сходить с ума… единственное лекарство что я нашёл - ставить и убирать пробелы и после каждого поставленого / убраного пробела сохранять(Ctrl+S по крайней мере, сохранение кнопкой не тестил), через 20-50 таких действий обычно всё приходит в порядок… на следующие полторы минуты… если бы “свернуть все регионы” сворачивало всё - можно было бы хотя бы отформатировать и свернуть всё, правда при сворачивании регионов ещё сбивается то на какую строчку смотришь… в любом случаи это фиговое решение проблемы, но пока вы разбираетесь если добавить хотя бы чтоб сворачивалось всё и сохранялась позиция камеры - можно будет как то работать

вот вам ещё поинтереснее

begin
writeln(((1,2,3),(4,5)));
end.

[details=стек ошибки компилятора]Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :‘System.Exception: System.Exception: У корневого элемента нельзя получить Parent в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ReplaceUsingParent(syntax_tree_node from, syntax_tree_node to) в SyntaxVisitors.SugarVisitors.TupleVisitor.visit(tuple_node tup) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTree.BaseChangeVisitor.DefaultVisit(syntax_tree_node n) в PascalABCCompiler.SyntaxTree.WalkingVisitorNew.ProcessNode(syntax_tree_node Node) в PascalABCCompiler.SyntaxTreeConverters.StandardSyntaxTreeConverter.Convert(syntax_tree_node root) в PascalABCCompiler.SyntaxTreeConverters.SyntaxTreeConvertersController.Convert(syntax_tree_node root) в PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit) в PascalABCCompiler.Compiler.Compile()’[/details]

Исправили

begin
  var a: array[1..2] of integer;
  var b: array[1..2] of integer;
  a := b;
end.

Program1.pas(4) : Нельзя преобразовать тип array [1…2] of integer к array [1…2] of integer

я читал на этом форуме что статичные массивы убого медленные, но решил протестить на сколько же(~в 2.2 раза медленнее чтение и запись чем у динамических), ну и сравнивал с кортежами, в общем не приятно так как то

begin
  var a,b: array[1..2] of integer;
  a := b;
end.

ну а так разумеется работает

Это не ошибка. У статических массивов не структурная, а именная эквивалентность. Поэтому a и b - разных типов

Они практически одинаковые по скорости. Если у Вас как-то не так, то опубликуйте тесты.

Это точно. Одна из причин, из-за которой я крайне сильно не любил ТурбоПаскаль и иже с ним. Простейшая программа с процедурами, использующими массивы, превращалась в ужас наподобие Fortran II. Знакомство с возможностями PascalABC.NET 3.2 в части работы с динамическими массивами сделало меня горячим сторонником этой версии паскаля и теперь я считаю, что статические массивы служат лишь для обеспечения совместимости с программами, написанными на “додревних” версиях.

В конце-концов, если человек считает себя разумным, он должен уметь публично признать свои заблуждения и вовремя от них отказаться.

Мы практически не используем статические массивы в обучении.

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

имеем:

function operator+=<T>(a, b: array of T): array of T; extensionmethod := a + b;
begin
end.

после 3 форматирований получаем:

function operator+=<T>(a, b: array of T): array of T; extensionmethod; extensionmethod; extensionmethod; extensionmethod; extensionmethod; extensionmethod; extensionmethod;extensionmethod := a + b;

begin
end.

ничего не смущает? :slight_smile: а вот меня смущает, каждый раз теперь после форматирования чинить… кстати добавьте эту функцию стандартный модуль, + там есть, но писать Result := Result + a как то криворуко…

А что она делает?

реализует оператор += для динамических массивов, в стандартном модуле есть оператор + для массивов, вот я думаю почему бы не добавить +=… кстати я ошибку допустил


procedure operator+=<T>(var a: array of T; b: array of T); extensionmethod;
begin
a := a+b;
end;

вот так правильно

на githube нет

Ну, это другое дело. Мы не стали это делать, как и операцию a += 5, по той простой причине, что динамический массив - не расширяемый в процессе выполнения. Ну то есть расширять его можно, но накладные расходы велики. Для этой цели надо использовать List < T > - там эти операции есть