
Другие языки программирования и технологии
Паскаль. Функция 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 платформе.
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 платформе.
Владислав Тюкленков
По-любому писать свой велосипед для таких элементарных вещей нет необходимости.
Скорее всего потому, что PascalABC.net поддерживает юникод и длинные строки. И своим s[0] ты попадаешь в какое-нибудь старшее слово указателя на кучу или просто мусор.
1. а что так делается возврат?
Павел Спирин
В 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 в Си++ намного удобнее и оптимальнее. И читаться код лучше будет.
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 в Си++ намного удобнее и оптимальнее. И читаться код лучше будет.
Илья Баршев
А ты убери [12] и ВНЕЗАПНО перестанет работать.
Пользуйтесь уже s.Length и забудьте про код, который писали 30 лет назад.
И пользуйтесь Result вместо имени функции. А ещё лучше
function Length_x(s: string) := s.Length;
И пользуйтесь Result вместо имени функции. А ещё лучше
function Length_x(s: string) := s.Length;
Похожие вопросы
- Люди,объясните подробно,пожалуйста,что значит в Паскале функция ord(x) и ей обратная chr(x) ?
- Написать реализацию перегруженных функций: int func (int * arr, int length); int func (double * arr, int length);
- паскаль процедуры и функции
- Написать программу в Паскале для построения графика функций. К программе желательно составить алгоритм.
- Паскаль, домашка, одномерный массив и функции, ХЭЛП!
- Почему в базовом Паскале не предусмотрена функция степени?
- Аналог ассоциативного массива в Паскале.
- Я внутри написал, что я знаю про паскаль не то что решать и все такое а так теоретический в общем, смысл проги, я прав?
- ПАСКАЛЬ и ГРАФИКА
- Как в паскале процедуру или функция сохранить в файл а потом её использовать?