Ошибки PascalABC.NET

9 posts were split to a new topic: Ленивые вычисления в PascalABC.NET

7 posts were split to a new topic: Halt и незакрытие файлов

Обычная ошибка с автоопределением типов. Лечится указанием типа:

    foreach var x : Boolean in s do

Ошибка исправлена уже - я об этом писал

модуль crt не работает. При воспроизведении пишет что crt можно запускать только через Shift+F9. Потом при нажатии shift+F9 вылетает.

А Вы сохраните программу. У Вас наверное диск защищен от записи.

всё равно не работает

Нам не удаётся воспроизвести ошибку. На скриншоте я вижу, что файл не найден. Это очень странное сообщение.

7 posts were split to a new topic: Ошибки в справке PascalABC.NET

Собственно, все видно из картинки. Было время, для динамичеcких массивов это нормально работало.

А это и не должно работать.

Интеллисенс ввел вас в заблуждение. Надо исправить

Что делать - пока это один из наиболее доступных “компасов” в океане новых возможностей языка.

1 лайк

Не работает кортежное присваивание вот в таком примере (пытался упростить, но на скорую руку не сильно упростилось).

type SNode<T> = class
    data: T;
    next: SNode<T>;
end;

var mynil : SNode<integer> = nil;

function g := (mynil, mynil);

begin
    var f, l : SNode<integer>;
    (f, l) := g();
end.

Исправили

1 лайк

Может, это не считается ошибкой, но вот такая проблема. Нижеследующая программа в последних версиях (конец 2015 — начало 2016) выводила 1, а сейчас выводит [1,2,3]. Из-за этого поломалось несколько старых программ :frowning:

procedure g<T>(params a:array of T);
begin
  write(a[0]);
end;

procedure f<T>(params a:array of T);
begin
  g(a);
end;

begin
  f(1,2,3);
end.

Кажется мне, что Intellisense как-то неправильно показывает подсказки для кортежей.

type
  DNode<T> = class
  public 
    
    /// Поле данных
    data: T;
    
    /// Поле связи с предыдущим узлом
    prev: DNode<T>;
    
    /// Поле связи со следующим узлом
    next: DNode<T>;
    
    /// <summary>
    /// Инициализирует новый экземпляр узла двусвязного списка
    /// со значением dt поля данных и ссылками prev, next на соседние узлы
    /// </summary>
    /// <param name="dt">Значение поля данных узла</param>
    /// <param name="prev">Сслыка на предыдущий узел</param>
    /// <param name="next">Сслыка на следующий узел</param>
    constructor(dt: T; prev, next: DNode<T>);
    begin
      data := dt;
      self.prev := prev;
      self.next := next;
    end;
  end;

/// Тип для облегчения работы с двусвязными списками
type
  DList<T> = (DNode<T>, DNode<T>);

/// Создание узла двусвязного списка
function MkDNode<T>(dt: T; prev: DNode<T> := nil; next: DNode<T> := nil):= new DNode<T>(dt, prev, next);

/// Создание двусвязного списка по массиву заданных элементов
function CreateDList<T>(params a: array of T): DList<T>;
begin
  var firstD: DNode<T> := nil;
  if (a = nil) or (a.Length = 0) then
  begin
    Result := Rec(firstD, firstD);
    exit;
  end;
  
  firstD := MkDNode(a[0]);
  var lastD := firstD;
  
  for var i := 1 to a.Length - 1 do
  begin
    lastD := MkDNode(a[i], lastD);
    lastD.prev.next := lastD;
  end;
  
  Result := Rec(firstD, lastD);
  
end;

begin
  var five := CreateDList(1, 2, 3, 4, 5);
  Write(five.Item3.data);
end.

Из данного кода видно, что функция CreateDList возвращает кортеж, где Item1 - ссылка на первый элемент списка, а Item2 - ссылка на последний элемент. Однако по точке нам показывается целых 5 Item’ов. Если создать список из 6 элементов, то по точке соответственно будет показываться уже 6 Item’ов. Естественно, все Item’ы дальше второго работать не будут.

Исправлено

Минутка загадочного

unit test;

interface

/// Создаёт текстовый файл на основе заданного текстового. 
/// Новый файл состоит из тех строк, которые начинаются с заданного символа
procedure LinesStartsWith(fname, new_fname: string; c: char);

implementation

procedure LinesStartsWith(fname, new_fname: string; c: char);
begin
  Assert(fname <> '', 'File name cannot be empty');
  Assert(new_fname <> '', 'Name of a new file cannot be empty');
  
  WriteAllLines(new_fname, ReadLines(fname).ToArray.FindAll(x -> x.StartsWith(c)));
  
end;

end.

Загадочное заключается в том, что FindAll почему-то не показывается по точке. А если написать модуль в сокращённой форме, то показывается. Ну и если в основной программе строить такую конструкцию, то всё показывается.

Не показываются впрочем все 5 Find’ов, от Except до First.

Тут нет.

А тут есть.

В ходе небольшого расследования выяснилось, что в подсказке по точке пропадает ещё много чего (Slice, Sort, Sorted и т.д.). Кажется, что пропадает всё добавленное вручную в Паскаль, а пришедшее из .NET остаётся.

1 лайк

Работая с модулем GraphABC при работе с рисунками (picture) возникает такая ошибка, что изменяя рисунок и присваивая его значения другому и изменив первый снова, второй и первый рисунок становятся идентичными. К примеру вот такой код

    Uses GraphAbc;
Var p, a,b,c:picture;
Begin
 p:=picture.Create(100,100);
 a:=picture.Create(100,100);
 b:=picture.Create(100,100);
 c:=picture.Create(100,100);
 a:=p;
 p.Circle(40,40,20);
 b:=p;
 p.Rectangle(40,40,60,60);
 c:=p;
 p.Draw(0,0);
 a.Draw(0,150);
 b.Draw(150,0);
 c.Draw(150,150);
end.

Казалось бы a<>b<>c<>p. Однако при выводе рисунков на экран получается 4 идентичные картинки. Скажите, это также не должно работать как и p.floodfill ? Или можно каким-то образом изменить код.

p. s. Один маленький вопрос. Есть ли какой-либо модуль, или команда (класс, объект) который бы мог выводить звук?