![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Длина строки [D7, WinXP]
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-шных функциях.