Это удачная мысль. Наверно я в прошлой жизни был восточным человеком, потому что для меня все функции, “делающие Last” всегда понимаются перебирающими элементы от конца к началу.
Вообщем, переделал я на 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.
Наткнулся на некоторые ошибки/неточности в имплементации строк:
- Компилятор не ругается на
string[256]
, хотяshortstring = string[255]
; - Компилятор ругается на
string[257]
, но сообщение об ошибке не очень информативно (что значит ‘неправильный’?):
string-tests.pas(5) : Неправильный размер типа string
Лучше выдавать, напр., в такой формулировке:
string-tests.pas(5) : Размер типа string[length] должен быть в диапазоне от 1 до 255; если необходимо больше, используйте безразмерный тип string
- Мелочь, но все же… В сообщении компилятора пропущена запятая перед словом ‘кроме’:
string-tests.pas(3) : Не используйте короткие строки нигде кроме как в записях для сохранения в типизированный файл
-
Самое главное: при инициализации короткой строковой переменной динамической строкой большего размера (в виде другой переменной или результата функции, но не с помощью строкового литерала!) одновременно с её описанием, её тип игнорируется и заменяется на безразмерный
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.
Раздел справки “Справочник по языку / Обобщенные типы / Ограничения на параметры обобщенных подпрограмм и классов”:
- сразу 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;
- Думаю, следует еще уточнить текст комментария к этому коду:
К сожалению, нет возможности использовать операцию <, поскольку операции не входят в интерфейсы.
Читающим справку не будет ясно из этого текста, о каких именно операциях и фундаментальных ограничениях языка идет речь, т.к. оператор сравнения все-таки есть в коде примера. Предлагаю такую формулировку:
К сожалению, при работе с обобщенными типами нельзя использовать операторы сравнения (кроме операций “=” и “<>”) напрямую, без обращения к методу CompareTo(), поскольку такие операции в PascalABC.NET не реализуемы через обобщенные интерфейсы.
Справку поправили - спасибо - в следующей версии выйдет. 256 заменили на 255. По поводу var s: string[255] := longstr;
- да, увидели, написали в Issue.
Вообще, конечно, удивительно, как старый неэффективный код доставляет много проблем.
У меня возникает постоянно, с любым кодом, даже с пустым.
Поправили эту ошибку - выйдет в ближайшем обновлении