Ошибки PascalABC.NET

Мда… Когда я начал составлять пример в программе понял на сколько абсурдна идея, но я имел в виду что то типо этого:

type
  t1 = class
  
  end;

class procedure t1.p1; extensionmethod;
begin
  
end;

begin
end.

Абсурдность в том что не может быть никакого self… Но вообще внешне описывать статичные вне тела типа было бы удобно, к примеру дописать System.Math своими методами, экземплярные же можно сделать так…

При попытке отформатировать код программы с namespace вылетает ошибка.

. Как именно работают пространства имён тоже не совсем понятно. -------------------------U1.pas----------------------------- Namespace U1; Type Reader=Class End; End. -------------------------U2.pas----------------------------- Namespace U2; Type Writer=Class End; End. -------------------------MyLib.pas----------------------------- Library MyLib; {$IncludeNamespace ‘U1.pas’} {$IncludeNamespace ‘U2.pas’} End. При компиляции вроде-бы всё хорошо, но вот при попытке подключения к программе MyLib.dll возникает проблема: в ней нет ничего. Ни пространств имён U1, U2; ни их содержимого. Может, я что-то не правильно делал?

вот так правильно: {$includenamespace U1.pas}

но пространства имен еще не готовы.

1 лайк

Спасибо большое! Сейчас есть какие-то возможности?

Программа из справки:

{$define DEBUG} 
begin
  {$ifndef DEBUG}
  writeln('Имя DEBUG не определено');
  {$else} 
  writeln('Имя DEBUG определено');
  {$endif}
end.

Она форматируется, не ставя отступы перед writeln-ами, хотя в справке они есть, ошибка в справке или форматировании? ИМХО отступы будут приятной фичей…

P.S. DEBUG осталось определено после удаления первой строчки и выключения настройки Генерировать отладочную информацию (Debag-версия) Откуда оно берётся?

Здравствуйте! Возникла такая проблема: при компиляции программы возникает ошибка в строке Var Input: array of array of array of System.int32:=***.ToArray(new Bitmap('input.jpg')); При этом тип возвращаемого значения функции ToArray соответствует указанному. После замены на Var Input: array of array of array of System.int32:=***.ToArray(new System.Drawing.Bitmap('input.jpg')); ругается на отсутствие ; после System, однако если вызвать конструктор по имени, без new, то всё работает нормально.

Так ничего не понятно, дайте полную версию, желательно вместе с целым .pas файлом. И что за ***?

Очень хотелось бы узнать, системные классы в паскале когда то получат нормальное описание? Вот сейчас мне надо было System.NullReferenceException, я решил посмотреть через паскаль и увидел только 4 конструктора от всего типа. С анализатором кода не лучше, он видит только первую строчку описания у третьего конструктора и вообще не видит четвёртый конструктор. Это только 1 пример, таких полупустых классов-метаданных полно.

Сама форма вопроса свидетельствует о том, что Вы его многократно задавали и получали отказ.

По сути вопроса ничего не понятно. В справочной системе описания не будет - это классы .NET. В классе 4 конструктора, куча методов и свойств - анализатор кода их видит.

Ммм нет я ни разу не спрашивал, но меня это давно тревожит и я надеялся что со временем описания допишут. А в чём смысл изначально этих полупустых страниц, если документацию правильно смотреть всё же на msdn. Хотя бы поставьте в начале каждой такой страницы метаданных где полная версия(ссылку или т.п.).

А по моему нет:

Я не понимаю, о каких полупустых страницах Вы говорите. Я вижу короткую справку по конструктору у Вас на скриншоте. Эта информация берется нами из стандартниго xml-файла, который поставляется вместе с .NET для русских подсказок. Этот же файл используется для подсказок в Visual Studio. Полную документацию надо смотреть на MSDN. Мы в своё время пытались сделать, чтобы по нажатию на F1 загружался браузер с подсказкой из MSDN. И это во многих случаях работает. Например, нажмите F1 на слове NullReferenceException и посмотрите, что получится.

Пред описание записей не работает, это ошибка или так задумано?

type
  r1=record;
  
  r1=record
  
  end;

begin
end.

Это вызовет ошибку.

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

type
  Ir1 = interface end;
  
  r1 = record(Ir1)
  
  end;

begin
  
  var a: Ir1;
  var b := a as r1;

end.

А тут? Это не продумана ситуация с записями и интерфейсами, или они хоть и могут реализовывать интерфейсы, но всё же не совместимы с алгоритмом as?

Да, несовместимы. as работает со ссылочными типами

type
  Ir1=interface end;
  
  r1=record(Ir1) end;
  
begin
  
  var a := new Ir1[1];
  a[0] := new r1;
  writeln(a);
  
end.

Выведет [nil] хотя разумеется там что то записано. Я уже добивался такого эффекта поинтерами и знаю, что ни к чему хорошему работа с такими переменными не приводит. Это ошибка паскаля или так и C++ работает?

один конструктор protected, поэтому и не виден

Внёс в Issue. По-видимому, ошибка

Только что добавил issue на гитхабе и очень мучает вопрос: откуда взялось число 16777215. Это было бы максимальным значением uint24 ЕСЛИ БЫ такой тип существовал… Так какую магию вы использовали?)))

там нет ошибки. для метода с вложенными процедурами генерируется специальный метод $p1$4.p1 с параметром, в котором передается запись активации. этот метод вызывается из p1. и чтобы при отладке по F7 пропускался этот вызов, в сорсконтекст test.t1.p1 и помещается магическая константа 16777215. Эта константа используется отладчиком .NET. так что закрывайте issue.