модуль 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’ы дальше второго работать не будут.
Исправлено
Минутка загадочного
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 остаётся.
Работая с модулем 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. Один маленький вопрос. Есть ли какой-либо модуль, или команда (класс, объект) который бы мог выводить звук?
System.Console.Beep({частота}, {длительность_в_миллисекундах});
— через системный спикер (если таковой имеется ;–)
А проигрывание файла так:
{$reference 'PresentationCore.dll'}
uses
GraphABC;
begin
var fsound := new System.Windows.Media.MediaPlayer;
fsound.Open(new System.Uri('Новый год в салоне самолета.mp3', System.UriKind.Relative));
fsound.Play;
end.
У Вас в коде a,b,c,p ссылаются на одну картинку. Поэтому всё работает так как и полагается. То есть, у Вас a=b=c=p.
Пишите
a.Circle(40,40,20);
b.Rectangle(40,40,60,60);
Посмотрите также в справке раздел Ссылочные типы
да, а можно ли как-то сделать осциллятор звука