Исправили сообщение об ошибке
Используя модуль GraphABC я составил программу
Uses GraphAbC; Var p:picture;
Begin p:=picture.Create(100,100);
p.FloodFill(50,50,clred); p.Draw(50,50); end.
Казалось бы, результат данной программы это вывод красного квадрата в область окна, однако при запуске данной программы ожидаемого результата не последовало. Я считаю, что это ошибка модуля GraphABC, если это не так, пожалуйста, запишите правильный рабочий код. С уважением пользователь
Да, FloodFill для рисунков не работает.
Обычная ошибка с автоопределением типов. Лечится указанием типа:
foreach var x : Boolean in s do
Ошибка исправлена уже - я об этом писал
модуль crt не работает. При воспроизведении пишет что crt можно запускать только через Shift+F9. Потом при нажатии shift+F9 вылетает.
А Вы сохраните программу. У Вас наверное диск защищен от записи.
всё равно не работает
Нам не удаётся воспроизвести ошибку. На скриншоте я вижу, что файл не найден. Это очень странное сообщение.
Собственно, все видно из картинки. Было время, для динамичеcких массивов это нормально работало.
А это и не должно работать.
Интеллисенс ввел вас в заблуждение. Надо исправить
Что делать - пока это один из наиболее доступных “компасов” в океане новых возможностей языка.
Не работает кортежное присваивание вот в таком примере (пытался упростить, но на скорую руку не сильно упростилось).
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.
Исправили
Может, это не считается ошибкой, но вот такая проблема. Нижеследующая программа в последних версиях (конец 2015 — начало 2016) выводила 1
, а сейчас выводит [1,2,3]
. Из-за этого поломалось несколько старых программ
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’ы дальше второго работать не будут.