Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Длина строки [D7, WinXP]


Страницы:   1 2

Dmitry_177 ©   (2007-05-20 01:11:00) 

При использовании API функций часто бывает пользуются такой схемой:

var
str: string;
...

SetLength(str, MAX_PATH);
...какаянибудь API функция в которую передается PChar(str)
str := PChar(str);  или SetLength(str, StrLen(PChar(str)));

Так вот я хотел бы спросить, как потом правильней будет укоротить спроку, так:

str := PChar(str);

или так:

SetLength(str, StrLen(PChar(str)));


И еще, потом после использования переменной str, т.е. когда она стала ненужной, нужно ли ей задавать нулевой размер, т.е так:

SetLength(str, 0);

чтобы в памяти она не занимала места?


Сергей М.   (2007-05-21 10:48:00) [21]


> Dmitry_177   (21.05.07 10:43) [12]


MAX_PATH будет вполне достаточно.


Dmitry_177   (2007-05-21 10:43:00) [22]

У меня еще вопрос.. делаем мы так:

SetLength(str, MAX_PATH);
...какаянибудь API функция в которую передается PChar(str), а длинну строки MAX_PATH или MAX_PATH + 1?

ведь строка же должна завержаться нулевым символом, а это значит еще один символ.. Так вот чтобы правильно все было сколько нужно задать в SetLength и в какойнибудь API на примере с MAX_PATH?


Однокамушкин   (2007-05-20 21:08:00) [23]


> Anatoly Podgoretsky ©   (20.05.07 12:12) [10]

Сама переменная str не перестаёт быть переменной типа string... просто APIшные функции работают с тем же буфером в обход этой переменной...


Anatoly Podgoretsky   (2007-05-20 12:12:00) [24]

> Однокамушкин  (20.05.2007 10:14:07)  [7]

При возврате из АПИ перестает, поскольку АПИ ничего не знает о структуре строк Паскаля, ему глубоко плевать на это, отсюда или недостоверная информация в структуре или что обычно AV


Anatoly Podgoretsky   (2007-05-20 12:10:00) [25]

> Dmitry_177  (20.05.2007 08:35:06)  [6]

Она не обрежется, она переопределится.
А вот если такое произойдет в АПИ, то я тебе не завидую.


Anatoly Podgoretsky   (2007-05-20 12:09:00) [26]

> Германн  (20.05.2007 02:42:05)  [5]

Не мешает, но непорядок, тем более что есть стандартный путь, который не зависит от заморочек программистов.


Однокамушкин   (2007-05-20 10:14:00) [27]


> Как сделать из str опять обычный string?


Она никогда не перестаёт быть обычным stringом... и ничего обрезаться не будет. Как только строка меняет значение, о том, что там когда-то давно ей делали SetLength, она сразу забывает...


Dmitry_177   (2007-05-20 08:35:00) [28]

Так все же str := PChar(str);  или SetLength(str, StrLen(PChar(str)));?

А если будет такая схема:

SetLength(str, MAX_PATH);
...какаянибудь API функция в которую передается PChar(str)
str := PChar(str);  или SetLength(str, StrLen(PChar(str)));

а потом в этой же функции или процедуре нужно str присвоить какую-нибудь строку

str := 'vbrftgbtrbrtntrentrnrthne';

так вот если присваемая строка будет длиннее чем бы задали SetLength-ем, она обрежется? Как сделать из str опять обычный string?


Германн   (2007-05-20 02:42:00) [29]


> Anatoly Podgoretsky ©   (20.05.07 02:28) [3]
>
> > Германн  (20.05.2007 02:01:01)  [1]
>
> Я бы не стал, поскольку нет единства, иногда это длина строки,
>  а иногда +1
> А вот PChar(S) гарантировано.

И я бы тоже не стал, но "+1 ", имхо гарантирует ну хоть что-то. Лишний выделенный байт в массиве, врядли сможет реально помешать программе.
:)


Anatoly Podgoretsky   (2007-05-20 02:30:00) [30]

> Dmitry_177  (20.05.2007 01:11:00)  [0]

Можно так SetLength(str, 0), но можно и str := nil или str := ''
Результат одинаков, а можно и не делать, при выходе за пределы видимости переменная сама обнулится


Anatoly Podgoretsky   (2007-05-20 02:28:00) [31]

> Германн  (20.05.2007 02:01:01)  [1]

Я бы не стал, поскольку нет единства, иногда это длина строки, а иногда +1
А вот PChar(S) гарантировано.


Германн   (2007-05-20 02:13:00) [32]

<offtop>
Классная очепятка получилась! Is'nt it?
</offtop>
Ей-богу всё вышло случайно.


Германн   (2007-05-20 02:01:00) [33]


> Dmitry_177   (20.05.07 01:11)
>
> При использовании API функций часто бывает пользуются такой
> схемой:
>

При использовании API-функций, как правило, рекомендуется обращать внимание на размер возвращаемых данных, которые как правило присутствуют в API-шных функциях.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо