Другие языки программирования и технологии

Паскаль. Функция length

Предположим, что стандартной функции length нет. Требуется описать её самостоятельно. Используется PascalABC.net. Почему приведённая функция работает некорректно?
Потому что то, что Вы написали работает в некоторых версиях Pascal, где строки максимум 255 байт и устроены по принципу нулевой байт = длине строки, далее строка.

Pascal ABC.Net внезапно использует строки string как это принято в .NET (и как это делает C#), где это целый класс, а не просто структура/запись/массив. И, если покопаться как он устроен, легко найти, что есть поле длины и поле первого символа.
[NonSerialized]private int m_stringLength;
[NonSerialized]private char m_firstChar;
https://referencesource.microsoft.com/#mscorlib/system/string.cs,8281103e6f23cb5c
Но не факт что они будут расположены подряд в памяти и, как Вы наверное заметили - длина int а не байт.

Соотв. "функция" (на самом деле поле) что "считает" длину строки в Pascal ABC.NET просто возвращает это поле. Т. е. не имеет никакого смысла писать свою фукнцию вычисления длины, когда есть уже поле, которое хранит длину, тем более вся "внутренняя кухня" скрыта для доступа. А сделать свой класс и переопределить функции не получится, т. к. класс String, как и многие фундаментальные классы, помечен как sealed. Т. е. запрещено наследование. Всё как положено в C# и .NET платформе.
Senya Semyonov
Senya Semyonov
84 764
Лучший ответ
Владислав Тюкленков По-любому писать свой велосипед для таких элементарных вещей нет необходимости.
Скорее всего потому, что PascalABC.net поддерживает юникод и длинные строки. И своим s[0] ты попадаешь в какое-нибудь старшее слово указателя на кучу или просто мусор.
Илья Баршев
Илья Баршев
96 548
1. а что так делается возврат?
Дима Кузьмин
Дима Кузьмин
67 195
Павел Спирин В Pascal - да: значение функции присваивается псевдопеременной - имени функции.
А у меня вот так в Delphi 7 все работает:

procedure TForm1.FormCreate(Sender: TObject);
var
s : string[12];
n : integer;
begin
s := 'abc';
n := ord(s[0]);
showmessage(inttostr(n));
end;

И, результат функции всегда возвращали через Result, через имя функции - это только в PascalABC.net. В этом что-то избыточное есть. Вот, называется у меня функция OneTwoMegaDriveToSuperFunction. И, что, мне писать в теле функции OneTwoMegaDriveToSuperFunction := 5+5? "Result" или return в Си++ намного удобнее и оптимальнее. И читаться код лучше будет.
Денис Лапшин
Денис Лапшин
23 766
Илья Баршев А ты убери [12] и ВНЕЗАПНО перестанет работать.
Пользуйтесь уже s.Length и забудьте про код, который писали 30 лет назад.

И пользуйтесь Result вместо имени функции. А ещё лучше

function Length_x(s: string) := s.Length;