Ошибки PascalABC.NET

Вообщем, переделал я на 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.

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

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

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

label 10;
begin
  var i := 20;
  while true do 
  begin
    i -= 1;
    if i = 10 then break;
    if i = 12 then goto 10;
    continue;
    10:
    i -= 1;
    Writeln('Here we are!')
  end;
  Writeln('Finish')
end.

Ложное предупреждение при компиляции: Program1.pas(10) : Обнаружен недостижимый код Ругается на строку после continue. Да, этот код плохой, даже очень плохой, но он имеет право на существование без подобных “ворнингов”. Потому что программа на самом деле работает и “достигает”:

Here we are! Finish

Наткнулся, портируя дремучую фортрановскую программу, где метка на метке и довольно долго разбирался, кто у нас дурачок - я или компилятор. А вдруг и правда код недостижим? (там было довольно сложное условие попадания на метку)…