Первую ошибку с 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.
Да, извините - закачал последнюю версию от 20.07 на сайт. Проверьте с ней. Версия от 07.07 ошибку еще содержит. Если внутренняя ошибка компилятора останется - присылайте весь проект.
Выдает внутреннюю ошибку компилятора, на таком примере
/// Вывод различных типов процедурой 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.
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 то отрабатывает правильно…
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.