ansistring заданной длины

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

ansistring заданной длины

Сообщение Сквозняк » 21.11.2014 19:22:23

Как реализовать вот такое?
Код: Выделить всё
type
AA = ansistring[1000];
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: ansistring заданной длины

Сообщение Mikhail » 21.11.2014 21:37:59

Зачем? :?
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: ansistring заданной длины

Сообщение Сквозняк » 21.11.2014 22:41:48

Для лучшей совместимостью с кодом использующим кучу string. У string сразу доступны для использование все байты массива, даже если в нулевом его элементе записан 0.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: ansistring заданной длины

Сообщение SSerge » 22.11.2014 05:30:08

Сквозняк
Хочешь пользоваться строками эффективно? :D Сделай их сам. То есть - свой тип данных, свою библиотеку функций, свою поддержку I/O для нового типа. :mrgreen: Пытаться что-то городить на внутренних структурах типа, непредсказуемым образом управляемым и перемещаемым компилятором и RTL - индусская забава, ибо легко получить код, валящийся от расположения планет и от изменений в логике библиотек. В мурзилке по fpc что сказано? - Даже указатель на элементы строк или указатель на сами строки использовать категорически не рекомендуется, передавая их вне кода, порождающего строку, потому что в любой момент строка может поменять свое местоположение в памяти, и этот указатель может стать некорректным.

И да, динамические строки в fpc - чертовски неэффективная по производительности штука. С медвежьей услугой по скрытому постоянному преобразованию строковых типов между собой и экземплярами строк, которую постоянно генерит компилятор
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: ansistring заданной длины

Сообщение Сквозняк » 22.11.2014 15:38:21

Зачем именно указатели? Обращение к любому элементу массива тоже хорошая фича, а в случае с ансистрингами такое возможно только при {$R-} что не есть хорошо, значит использование подобных фич придётся отлавливать при падениях программы. Мне нужны обычные короткие строки но с длиной не 255 а раз в 16 больше, этого должно хватить для большинства случаев применений строк с долбаным юникодом. Не может быть, чтобы ни у кого до этого не возникало подобных мыслей, но у нас почему-то в основном копипаста дельфийских фич а своих собственных - мало.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: ansistring заданной длины

Сообщение SSerge » 22.11.2014 16:18:59

Сквозняк
Ну а PChar c адресом, совпадающим с array of char необходимой длины и отдельное поле для текущей длины - тоже не нравится?
Суть то в чем - в дельфях нету - значит и не будет.
К тому же хаки, основанные на внутреннем представлении - вещь сугубо гадкая; :D Когда-то сам такое любил. Теперь жалею: когда надо что-то старое перевести, как сделано - не помню, разбираться по коду - нет ни времени ни охоты - проще заново переписывать.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: ansistring заданной длины

Сообщение Sergei I. Gorelkin » 22.11.2014 17:10:22

Ну, идея строк LongString - наподобие ShortString, только с двухбайтным полем длины - имела место быть, что видно по коду компилятора и RTL. Проблема в основном в том, что количество преобразований, которое нужно поддерживать, растет с добавлением каждого типа строк не линейно, а в геометрической прогрессии. Чего нельзя сказать о количестве разработчиков...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: ansistring заданной длины

Сообщение Сквозняк » 22.11.2014 18:20:02

SSerge писал(а):Ну а PChar c адресом, совпадающим с array of char необходимой длины и отдельное поле для текущей длины - тоже не нравится?

Не, не нравится, это ещё страшнее ансистрингов. Халявы нет, ясно.
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: ansistring заданной длины

Сообщение runewalsh » 22.11.2014 19:00:54

До некоторой степени заменимо array[0 .. 999] of char.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: ansistring заданной длины

Сообщение pda » 24.11.2014 19:06:46

Если собираешся работать со строками посимвольно, то:
Код: Выделить всё
var
  AA; AnsiString;
begin
  SetLength(AA, 1000);


Если одновременно надо использовать операции сложения, то можно создать record с полем AnsiString, инициализировать длину в конструкторе и перекрыть операторы присваивания и сложения. Получатся собственные строки с предраспределённым буффером, совместимые со стандартными строковыми функциями.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: ansistring заданной длины

Сообщение SSerge » 25.11.2014 05:56:21

pda
Код: Выделить всё
var
  AA: AnsiString;
  BB: AnsiString;
begin
  SetLength(AA, 1000);   // @AA условно 1
  BB:='this string';
  AA:=какая_то_строковая_функция(BB);  // @AA уже на другом адресе, реаллокация. И под данные отделено уже не 1000?


зато если

Код: Выделить всё
  AA[0]:=BB[0];
  AA[1]:=BB[1];    // исходный адрес и длина буфера сохраняются
  ...


У меня верные размышления на этот счет?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: ansistring заданной длины

Сообщение Дож » 25.11.2014 14:04:20

У меня верные размышления на этот счет?

Да.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: ansistring заданной длины

Сообщение pda » 25.11.2014 17:40:00

SSerge писал(а):У меня верные размышления на этот счет?

Да. Чтобы сохранить выделенный строковой буффер нетронутым вам надо перегрузить оператор присваивания и заменить присваивание на вызов Copy(). Так же вам придётся завернуть строку в record, и хранить вместе с полем длины, т.к. теперь стандартная функция Length() будет всегда возвращать 1000. В общем, это немного возни требует, но вполне можно создать модуль с собственным типом строк, с буффером фиксированного размера.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: ansistring заданной длины

Сообщение Ism » 27.11.2014 03:49:29

Tmemorystream и widestring спасут вас
Поток в памяти позволяет заранее выделять память и очищать
Widestring намного быстрее работает, так как каждый символ 2 байта

Также есть http://lazarus-ccr.sourceforge.net/docs ... tream.html
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: ansistring заданной длины

Сообщение SSerge » 27.11.2014 07:39:50

Ism писал(а):Widestring намного быстрее работает, так как каждый символ 2 байта


Утверждение чем-то подтверждается практически или основано на общей теории и тестах компиляторов Си?
Ибо применение UnicodeStrings, являющихся разновидностью тех же WideStrings, приводит к провальным последствиям по производительности. Плюс постоянные порождения временных переменных, плюс еще много чего.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru