Ошибки PascalABC.NET

Исправили сообщение об ошибке

1 лайк

Используя модуль GraphABC я составил программу

Uses GraphAbC; Var p:picture; 
Begin p:=picture.Create(100,100);
p.FloodFill(50,50,clred); p.Draw(50,50); end.

Казалось бы, результат данной программы это вывод красного квадрата в область окна, однако при запуске данной программы ожидаемого результата не последовало. Я считаю, что это ошибка модуля GraphABC, если это не так, пожалуйста, запишите правильный рабочий код. С уважением пользователь

Да, FloodFill для рисунков не работает.

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’ы дальше второго работать не будут.