Вниз
Скачать: CL | DM;

Можно ли хранить chr(0) в длинных строках D5 ?   Найти похожие ветки 

← →
JohnJohn   (2003-11-27 18:40) [0]

Как можно хранить chr(0) в D5 ?
По условиям задачи прежде всего нужно хранить строки с произвольным содержимым (в том числе и с CHR(0)) и произвольной длинной (скорее всего большей 255 символов).
Если строки никак, то каковы другие высокопроизводительные варианты?
Спасибо.


← →
Юрий Федоров ©   (2003-11-27 18:45) [1]

Хранить можно.
Выводить нельзя - обрежется по #0.
А как хранить? так же как и те, которые без #0
потому что длина строки определяется не первым вхождением #0,
а хранится отдельно


← →
AlexKniga ©   (2003-11-27 19:03) [2]

setlength();


← →
Юрий Зотов ©   (2003-11-27 19:37) [3]

> По условиям задачи прежде всего нужно хранить строки с
> произвольным содержимым (в том числе и с CHR(0)) и
> произвольной длинной

Это означает, что задача поставлена неверно. Потому что постановка навязывает возможный, но очень плохо подходящий метод решения. Замена строк на packed array of byte решает все проблемы.


← →
JohnJohn   (2003-11-28 05:52) [4]

Ага, приблизительно про chr(0) понял, но...
Строки - это так, на всякий случай, потому что могет потребоваться сортировки и прочее.
За packed array of byte отдельное спасибо...:)
Только вот непонятно, что значит "при выводе обрежется".
Имеется в виду, в визуальных компонентах или вообще, даже при выводе через winapi?


← →
Anatoly Podgoretsky ©   (2003-11-28 07:23) [5]

Обрежется не только при выводе, а во всех тех функция, где оиждается PChar и соответственно обрезка произойдет по #0. Но тоже проихойдет и с array of byte если этот буфер будет передан в такие функции.


← →
Danilka ©   (2003-11-28 08:44) [6]

[4] JohnJohn (28.11.03 05:52)

> Имеется в виду, в визуальных компонентах или вообще, даже
> при выводе через winapi?

В винАПИ используются строки с завершающим нулем, VCL - обертка винАПИ, короче, обрежется везде, при выводе на экран.
Правда, явно постановка хромает, нафига выводить на экран символ #0? :))
Одно дело - работа с бинарными данными, другое - обзывать их строками и работать с ними как со строками, во втором случае поимеешь глюки.


← →
Dimka Maslov ©   (2003-11-28 08:53) [7]

Как раз при выводе на экран и сравнении строк средствами выньапи не обрежется, поскольку эти функции принимают длину строки в явном виде, а не опираются на завершающий #0. Кто не верит может попробовать сам.


← →
Anatoly Podgoretsky ©   (2003-11-28 08:57) [8]

Во многих так, а в других наоборот, просто надо учитывать простой факт, ряд функций опирается на переданую длину, ряж на ограничитель строки.


← →
Danilka ©   (2003-11-28 09:06) [9]

[7] Dimka Maslov © (28.11.03 08:53)
угу, точно, прав ты, сейчас попробовал вывести DrawText - все ок. В то-же время, передать такой текст контролам - нельзя, обрежется.


← →
Alexander1966 ©   (2003-11-28 11:32) [10]

Можеш хранить в string;

Например:
s1:="111";
s2:=s1+char(0)+s1;

//s2 будет содержать в итоге 111_111 (_ это нулевой символ)

но ShowMessage(s2); покажет только 111

поэтому если тебе надо не для вывода,
а например для шифрования данных
или подготовки пакета для TCP/IP (как в Indy )
то подойдет string.

PS. А вот в С++Builder, мне пришлось работать с
STL для этого (vector, queue)


← →
JohnJohn   (2003-12-02 12:08) [11]

Ок, спасибо.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.015 c
1-36761
CrazyHacKeRs
2003-11-26 14:45
2003.12.12
Помогите примером работы с XSLT


3-36567
Erden
2003-11-20 16:18
2003.12.12
TImage ...


3-36583
Grrey
2003-11-18 16:30
2003.12.12
Возможно ли выбрать из ассоциативного массива (table) в Cursor


1-36638
Ciber
2003-12-01 06:30
2003.12.12
NEXT


1-36598
Dragon
2003-12-01 18:41
2003.12.12
Нужно извлечь текущий путь приложения.




   Наверх