Ошибки PascalABC.NET

Первую ошибку с Dictionary исправили. Теперь эта программа работает:

type
  point = class
    x, y: integer;
  end;
  Dic = Dictionary<string, point>;

begin
  var d := new Dic;
  
  d['key1']:= new point; // Один ключ инициализируется для примера
  d['key1'].x:= 10; // если даже исключить эти строки
  d['key1'].y:= 10; // при foreach ошибка будет такая же.
      
  foreach var kv in d do
    writeln(kv.key);
    
  writeln(d); // программа вылетает не доходя до этого оператора
end.

Версия - на сайте

Да, там написано: PascalABC.NET (версия 2.2, сборка 974 от 19.07.2015), но файлы старые. Скачал, установил, осталось: сборка 970 от 07.07.2015

Сравнил файлы: PascalABCNETSetup.exe PascalABCNETWithDotNetSetup.exe — не изменились.

Обновился до последней сборки (от 07.07), проект перестал компилироваться - “внутренняя ошибка компилятора”. ZIP-архив кнопкой не создаётся - среда разработки вместе с окном об ошибке зависает. Отчёт: http://pastebin.com/NarnyFC0 Если нужно, отправлю на почту проект (код более чем ужасен, выкладывать не хочу) Фреймворк свежий (вроде) http://i72.fastpic.ru/big/2015/0721/15/28fa3899854297fc2f1bc88dcbeb7f15.png

Да, извините - закачал последнюю версию от 20.07 на сайт. Проверьте с ней. Версия от 07.07 ошибку еще содержит. Если внутренняя ошибка компилятора останется - присылайте весь проект.

Создание zip архива проверим.

Компилируется без ошибок, спасибо.

Выдает внутреннюю ошибку компилятора, на таком примере

/// Вывод различных типов процедурой write
begin
  // Вывод, целого, строки, вещественного
  Writeln(1,' ',2.5);
  // Вывод множества
  Writeln([1..10]);
  // Вывод логического
  Writeln(True);
  var a: array [1..10] of integer;
  // Вывод массива (выводится его тип)
  Writeln(a.Print);
end.

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

Вот вывод компилятора:

//Здесь вы можете добавить свой комментарий


2015.08.08 12:53:24
PascalABCCompiler.Core v2.2.0.976 (2015.07.21), debug version
Runtime version: 4.0.30319.34209
OS version: Microsoft Windows NT 6.2.9200.0
Processor count: 8
WorkingSet: 111476 kb
StatesList: 
BeginCompileFile WriteAll.pas
BeginParsingFile WriteAll.pas
EndParsingFile WriteAll.pas
ReadPCUFile PABCSystem.pcu
ReadDLL System.dll
ReadDLL mscorlib.dll
ReadDLL System.Core.dll
ReadDLL System.Numerics.dll
ReadPCUFile __RedirectIOMode.pcu
ReadDLL System.Windows.Forms.dll
CompileInterface WriteAll.pas
EndCompileFile WriteAll.pas
SemanticTreeConversion Optimizer
CodeGeneration WriteAll.exe
CompilationFinished WriteAll.pas
Ready

Error[0]: Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :'System.Exception: System.IndexOutOfRangeException: Индекс находился вне границ массива.
   в PascalABCCompiler.NETGenerator.ILConverter.visit(ICommonNamespaceFunctionCallNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.visit(ICommonNamespaceFunctionCallNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertBody(IStatementNode body)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionBody(ICommonFunctionNode func)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionsBodies(ICommonFunctionNode[] funcs)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles)
   в PascalABCCompiler.Compiler.Compile()'

Если попробовать выполнить такую программу

/// Вывод различных типов процедурой write
begin
  // Вывод, целого, строки, вещественного
  Writeln(1,' ',2.5);
  // Вывод множества
  Writeln([1..10]);
  // Вывод логического
  Writeln(True);
  var a: array [1..10] of integer;
  // Вывод массива (выводится его тип)
  Print(a.Print);      // Отличие от прежней в замене Writeln на Print
end.

то в окне выводы выдается:

Ошибка времени выполнения: System.BadImageFormatException: Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)
Стек:
   в WriteAll.Program.$Main()
   в WriteAll.Program.Main()

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

Да, увидели - это ошибка компилятора. Ответ среды программирования в обоих случаях верен и информативен. Простого пользователя он напугает - и хорошо - мы узнаем раньше.

Текст, который Вы опубликовали, лучше скриншотов. Исправим.

Видимо, я неверно выразился. Давайте ещё раз.

Вы получили сообщение, которого не должно быть. Это не ваша ошибка. Это значит, что нами в компиляторе была сделана ошибка. Попросту - баг. Как только мы её исправим, эта ошибка исчезнет. Исправим - в ближайшее время.

К счастью, эта ошибка возникает “на задворках” - то есть, в коде, который пишется очень редко, поскольку не имеет смысла.

Исправить все такие ошибки - мы бы рады - это бы означало, что в компиляторе нет никаких ошибок.

System.BadImageFormatException - это редкое сообщение можно видеть тогда когда генерируется неверный IL-код, который виртуальная машина .NET не может выполнить. Это сообщение можно увидеть и в программах на C#, но очень редко.

Исправили. Теперь работает.

Версия - на сайте.

// к методу класса через экземпляр класса обращаться нельзя? так и должно быть?

type
  TestClass = class
  public 
    Num1: integer;
    class function Num2: integer := 100;
  end;
var
  t:TestClass;
begin
  t:= new TestClass;
  t.Num1 := t.Num2; // тут ожидает только экземплярный метод т.е. указывать класс -  TestClass.Num2 
end.
var i:integer :=10;
var s:string := q > 99 ? '#' : i.ToString();

ошибка - нельзя преобразовать тип string к char почему? что здесь не так?

В этом выражении тип устанавливается до разбора присваивания по первому из двух типов, а это char, и он не преобразуется к string. В C# тоже так

Так и должно быть. Так например в C#

PascalABC - версия 2.2 1011 Очень странное поведение …

TestClassConstructor.pas:

uses Unit2;

type
    TestClass1 = class
    private 
      class _i :integer;
    public 
      class function GetI:integer := _i;
      class constructor Create();
      begin
        _i := 15;
      end;
    end;
    
begin
  var i1:= TestClass1.GetI;
  Writeln('TestClass1-',i1);

  var i2:= TestClass2.GetI;
  Writeln('TestClass2-',i2);
end.

Unit2.pas:

Unit Unit2;

interface

type
    TestClass2 = class
    private 
      class _i :integer;
    public 
      class function GetI:integer := _i;
      class constructor Create();
      begin
        _i := 15;
      end;
    end;
 
implementation  

end.

при первой компиляции получаю TestClass1-15 TestClass2-15

при повторных компиляциях получаю TestClass1-15 TestClass2-0

куда копать?

PS: если перед запуском удалять файлы *.pcu то отрабатывает правильно…

Исправлено. Скачайте новую версию.

Антивирусник Avira выдаёт предупреждение о вирусе:

Конечно, никакого вируса нет, но Avira блокирует задания LinqBegin

1 лайк

PascalABC - версия 2.2 1013 следующий код выдает ошибку времени выполнения … если закомментировать TestFont1 то все работает

{$reference 'System.Drawing.dll'}

type
    TestClass1 = class
    private 
      class _i :integer;
    public 
      class TestFont1:System.Drawing.Font := new System.Drawing.Font('MS Sans Serif', 8);    
      class TestFont2:System.Drawing.Font;    

      class function GetI:integer := _i;
      class constructor Create();
      begin
        _i := 15;
        TestFont2 := new System.Drawing.Font('MS Sans Serif', 8);    
      end;
    end;
    
begin
  var i1:= TestClass1.GetI;
  Writeln('TestClass1-',i1);
end.

Все задания Exam… при запуске вызывают ошибку:

Это исправлено в последней версии. Скачайте и проверьте