Ошибки PascalABC.NET

Это удачная мысль. Наверно я в прошлой жизни был восточным человеком, потому что для меня все функции, “делающие Last” всегда понимаются перебирающими элементы от конца к началу.

Вообщем, переделал я на index вместо start

Проверка обновлений выдаёт вместо

Вы используете актуальную версию PascalABC.NET

VP_MF_VERSION_IS_UP_DO_DATE

(sic) в диалоговом боксе. Версия 3.2.1479

@Admin, спасибо за оперативно выпущенную сборку 1482 от 12.06.2017, но сообщение об актуальности версии по-прежнему не вернулось в свою русскую ипостась, несмотря на то, что на GitHub №422 помещен в выполненные.

Спасибо, я не заметил что ошибку уже описали в 422. Я так понял где-то неделю назад поменяли способ выдачи сообщения, но константу поставили VP_MF_VERSION_IS_UP_TO_DATE, а она ищет VP_MF_VERSION_IS_UP_DO_DATE и не находит.

Что-то в последних версиях намудрили с массивами символов. Вот такая программа:

const
  n = 11;
begin  
  var a: array[1..n, 1..n] of char;
  WriteLn('Так пусто:');
  for var i := 1 to n do
    begin
      for var j := 1 to n do
        begin
          if j mod 4 = 0 then a[i, j] := '|';
          if i mod 4 = 0 then a[i, j] := '-';
          Write(a[i, j]);
        end;
      WriteLn;
    end;
    WriteLn('А этого вообще не видно:');
  for var i := 1 to n do for var j := 1 to n do Write(a[i, j]);
end.

Не спрашивайте „кто?“ и „что?“, ибо она не моя ;–) А в результате выдаёт только „Так пусто:“ и всё!

Просто, на днях что-то тоже с символами делал и не смог… Пришлось запускать аж третий Delphi

Версия 3.2, сборка 1467.

Инициализируйте элементы массива пробелами перед сравнениями a[i,j]:=’ ';

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

Ну да. Символ с кодом 0 непредсказуемо влияет на поток ввода. Если Вы запустите по Shift-F9, то эффект будет другим

Спасибо, уже проверял, работает.

mod и div убивают подсказки: попробуйте к примеру Power: Power(//появились подсказки Power(10 div 2,//всё, подсказка сломана, если убрать её и снова нажать запятую на этой строчке - она не появится пока не убрать div

При использовании ctrl+c из окна программы и после этого ctrl+v возникает ошибка. Копируемый текст не имеет значения. OS Win10 x64 1703 build 15063.413

Че-то штука под названием details не работает

[details=ошибка]Подробная информация об использовании оперативной (JIT) отладки вместо данного диалогового окна содержится в конце этого сообщения.

************** Текст исключения ************** System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в ICSharpCode.TextEditor.TextAreaClipboardHandler.Paste(Object sender, EventArgs e) в VisualPascalABC.Form1.miPaste_Click(Object sender, EventArgs e) в System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e) в System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e) …

Да, знаем. Никак не можем поймать эту ошибку. Возникает редко

Впервые встречаю. Возможно, потому что winXP, 32 bit. Иногда работа на “отстойной технике” имеет свои плюсы))

begin
  var i := 123;
  print(object(i))
end. 

Наткнулся на некоторые ошибки/неточности в имплементации строк:

  1. Компилятор не ругается на string[256], хотя shortstring = string[255];
  2. Компилятор ругается на string[257], но сообщение об ошибке не очень информативно (что значит ‘неправильный’?):

string-tests.pas(5) : Неправильный размер типа string

Лучше выдавать, напр., в такой формулировке:

string-tests.pas(5) : Размер типа string[length] должен быть в диапазоне от 1 до 255; если необходимо больше, используйте безразмерный тип string

  1. Мелочь, но все же… В сообщении компилятора пропущена запятая перед словом ‘кроме’:

string-tests.pas(3) : Не используйте короткие строки нигде кроме как в записях для сохранения в типизированный файл

  1. Самое главное: при инициализации короткой строковой переменной динамической строкой большего размера (в виде другой переменной или результата функции, но не с помощью строкового литерала!) одновременно с её описанием, её тип игнорируется и заменяется на безразмерный string.

Если же отдельно описать такую переменную и только затем её проинициализировать динамической строкой большего размера, то исходный “короткий” тип строки сохраняется, а лишние символы при присваивании просто игнорируются (как и ожидалось). См. пример:

begin
  var s := 'abcdefghijklmnopqrstuvwxyz' * 10; // 260 chars
  var s255: shortstring := s;   // NOTE#1: string[255] silently becomes unlimited string type here!
  var s256: string[256] := s;   // NOTE#2: no error about string size > 255 and string[256] silently becomes unlimited string type here, too!
  //var s257: string[257] := s; // OK: compile-time error "Wrong string type size"
  println('s:', s.Length, s, NewLine);
  println('-' * 80);
  println('s255:', s255.Length, s255, NewLine); // Surprize! size of assumed shortstring = 260
  println('s256:', s256.Length, s256, NewLine); // Surprize! size of assumed string[256] = 260
  println('-' * 80);
  
  var ss255: shortstring;
  var ss256: string[256];       // NOTE#3: no error about string size > 255
  (ss255, ss256) := (s, s);     // NOTE#4: different (good) behaviour if var is type-defined first, then initialized later on
  println('ss255:', ss255.Length, ss255, NewLine); // OK: size of assumed shortstring remains = 255
  println('ss256:', ss256.Length, ss256, NewLine); // OK: size of assumed string[256] remains = 256
end.

P.S. Важно: уточнил формулировку проблемы в пункте 4.

Раздел справки “Справочник по языку / Обобщенные типы / Ограничения на параметры обобщенных подпрограмм и классов”:

  1. сразу 2 ошибки в последнем примере (уже писал про это где-то выше). А все потому, что копипаст – коварная штука!

Пример. Обобщенная функция поиска минимального элемента в массиве…

Неправильный код:

    function MinElem<T>(a: array of T): T; where T: IComparable<T>;
    begin
      var min: T := a[0];
      for var i := 1 to a.Length-1 do
        if min.CompareTo(a[i])<0 then
          min := a[i];
      Result := max;
    end;

Правильный код:

    function MinElem<T>(a: array of T): T; where T: IComparable<T>;
    begin
      var min := a[0];
      for var i := 1 to a.High do
        if a[i].CompareTo(min)<0 then
          min := a[i];
      Result := min;
    end;
  1. Думаю, следует еще уточнить текст комментария к этому коду:

К сожалению, нет возможности использовать операцию <, поскольку операции не входят в интерфейсы.

Читающим справку не будет ясно из этого текста, о каких именно операциях и фундаментальных ограничениях языка идет речь, т.к. оператор сравнения все-таки есть в коде примера. Предлагаю такую формулировку:

К сожалению, при работе с обобщенными типами нельзя использовать операторы сравнения (кроме операций “=” и “<>”) напрямую, без обращения к методу CompareTo(), поскольку такие операции в PascalABC.NET не реализуемы через обобщенные интерфейсы.

Справку поправили - спасибо - в следующей версии выйдет. 256 заменили на 255. По поводу var s: string[255] := longstr;

  • да, увидели, написали в Issue.

Вообще, конечно, удивительно, как старый неэффективный код доставляет много проблем.

У меня возникает постоянно, с любым кодом, даже с пустым.

Поправили эту ошибку - выйдет в ближайшем обновлении