Ошибки PascalABC.NET

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

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

в секции типов реально реализовать [DllImport]? (например как показано ниже)

ClassA = class
 [DllImport('kernel32.dll', SetLastError = true)]
 class function GetStdHandle(nStdHandle:System.Int32): System.IntPtr; external;
end;

Я не понял - при чем тут это. Ваш последний код не компилируется по причине external - это не могут быть статические методы.

Атрибуты можно вешать на всё, только секцию типов надо как-то отделить от процедуры с атрибутами.

Похоже Real.Parse(…, System.Globalization.NumberStyles.AllowDecimalPoint) не работает Программа не хотела парсить число пи, пока я не написал этого монстра:

begin
  var realLine := '3.1415926';
  var pi := 0.0;
  try
    Real.TryParse(realLine, System.Globalization.NumberStyles.AllowDecimalPoint, 
                  new System.Globalization.NumberFormatInfo(), pi);
  except
  end;
  Writeln(pi);
end.

Сегодня создал массив из 32 000 элементов. В режиме debug решил просмотреть значения первой десятки. Когда навел мышь и нажал “+” рядом с именем переменной, то программа повисла. Считаю, что это ошибка, и прошу исправить. Возможно, загружать такой большой массив в память это неправильно, но виснуть при этом ide не должна.

1 лайк

Функция “переименовать” не работает.

На какой программе не работает?

На всех, где я пытался её использовать. Версию скачал позавчера.

ну хоть один пример привести можно, а то у меня например переименовывается

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

linkinpark.pas (11.5 КБ)

попробуйте переименовать FrequencyWordPair во что угодно

type CharOccurances = record
  c: Char;
  n: Integer;
end;

begin
  var charData := new CharOccurances[24];
  for var i := 0 to 23 do
    charData[i].c := chr(ord('a') + i);
  foreach var data: CharOccurances in charData do
    foreach var symboll: Char in 'hello, world!' do
      if symboll = data.c then
        data.n += 1;
  for var i := 0 to 23 do
    Writeln(charData[i].c, ' ', charData[i].n);
end.

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

хорошо, эти 3 ошибки исправим в ближайшем билде. про Real.Parse не понял

begin
  var realLine := '3.1415926';
  var pi := 0.0;
  try
    Real.TryParse(realLine, System.Globalization.NumberStyles.AllowDecimalPoint, pi);
  except
  end;
  Writeln(pi); // выведет 0
end.

ну здесь скорее не TryParse, а Parse. В этот метод надо передавать NumberFormatInfo с заданным NumberGroupSeparator. Короче проще использовать StrToFloat.

1 лайк

Функция “сгенерировать реализацию” работает не совсем корректно. Если генерируется реализация для подпрограммы с параметрами по-умолчанию, то параметры по-умолчанию будут указаны и в реализации подпрограммы, что синтаксически неверно. Помимо этого, имеется одна странность в её работе. Иногда, если есть несколько нереализованных подпрограмм, то она генерирует реализацию сразу для всех таких подпрограмм, а иногда только для той, над которой было вызвано контекстное меню. И ещё хочется, что бы место для кода реализации было выбрано в соответствии с порядком объявления подпрограмм. То есть, что бы порядок реализации подпрограмм повторял порядок их объявления.

Почитал тему про алгоритм ханойских башен, вдохновился, хотел реализовать графически. на скорую руку написал код, прикрепляю его во вложении ниже. при компиляции открывается окошко внутренней ошибки компилятора с текстом: Указанный метод не поддерживается.

hanoiGraph.pas (2.2 КБ)

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

23.03.2015 18:29:55
PascalABCCompiler.Core v2.2.0.854 (08.03.2015), debug version
Runtime version: 4.0.30319.34209
OS version: Microsoft Windows NT 6.1.7601 Service Pack 1
Processor count: 4
WorkingSet: 103620 kb
StatesList: 
BeginCompileFile hanoiGraph.pas
BeginParsingFile hanoiGraph.pas
EndParsingFile hanoiGraph.pas
ReadPCUFile PABCSystem.pcu
ReadDLL System.dll
ReadDLL mscorlib.dll
ReadDLL System.Core.dll
ReadDLL System.Numerics.dll
ReadPCUFile GraphABCHelper.pcu
ReadDLL System.Windows.Forms.dll
ReadDLL System.Drawing.dll
ReadPCUFile GraphABC.pcu
CompileInterface hanoiGraph.pas
EndCompileFile hanoiGraph.pas
SemanticTreeConversion Optimizer
CodeGeneration hanoiGraph.exe
CompilationFinished hanoiGraph.pas
Ready

Error[0]: Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :'System.Exception: System.NotSupportedException: Указанный метод не поддерживается.
в System.Reflection.Emit.TypeBuilderInstantiation.GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
в System.Type.GetMethod(String name)
в PascalABCCompiler.NETGenerator.Helper.GetEnumeratorMethod(Type t)
в PascalABCCompiler.NETGenerator.ILConverter.visit(IForeachNode value)
в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value)
в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode value)
в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value)
в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode value)
в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value)
в PascalABCCompiler.NETGenerator.ILConverter.visit(IForNode value)
в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value)
в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode 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()'

Вот такие пироги.

Замените foreach обычным for-ом.

Ошибка с foreach уже исправлена

main.pas (356 Байт)