Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Длина строки |
Автор: Dmitry_177 20.5.2007, 00:13 | ||||||||
При использовании API функций часто бывает пользуются такой схемой:
Так вот я хотел бы спросить, как потом правильней будет укоротить спроку, так:
или так:
И еще, потом после использования переменной str, т.е. когда она стала ненужной, нужно ли ей задавать нулевой размер, т.е так:
чтобы в памяти она не занимала места? |
Автор: Dmitry_177 20.5.2007, 07:49 | ||
А если будет такая схема:
а потом в этой же функции или процедуре нужно str присвоить какую-нибудь строку str := 'vbrftgbtrbrtntrentrnrthne'; так вот если присваемая строка будет длиннее чем мы задали SetLength-ем, она обрежется? ИМХО вообще наверно переполнение будет.. Как сделать из str опять обычный string? |
Автор: MetalFan 20.5.2007, 11:01 |
чаще всего функции WinApi возвращают длину возвращаемой строки... |
Автор: Snowy 20.5.2007, 11:17 | ||||||
Второе просто производит больше ненужных действий.
При выходе за пределы видимости вся память, занимаемая строкой, будет освобождена автоматически.
При прямом присвоении уже не имеет значения, что там ей раньше присваивалось и какой размер устанавливался. |
Автор: Alexeis 20.5.2007, 12:03 | ||
Dmitry_177, передавать в API лучше всего строку типа str : array[0..size] of char; с нулем на конце. При конвертировании String в PChar нарушается работа подсчета ссылок в строках типа String. В результате легко испортить данные по выходу из процедуры. Если размер строки неизвестен, то можно воспользоваться следующим способом.
Каждый остается со своей строкой. Делфийская прога с делфийской, а винда с сишной строкой. Только прийдеться уже вручную освобождать память строки myStr, тогда когда она уже будет не нужна. |
Автор: Dmitry_177 21.5.2007, 09:44 | ||
У меня еще вопрос.. делаем мы так:
ведь строка же должна завержаться нулевым символом, а это значит еще один символ.. Так вот чтобы правильно все было сколько нужно задать в SetLength и в какойнибудь API на примере с MAX_PATH? |
Автор: Alexeis 21.5.2007, 09:56 |
Dmitry_177, ansi строки всегда завершаются нулем. Это делает компилятор за нас. Потому они совместимы с PChar. |
Автор: Dmitry_177 21.5.2007, 11:41 |
Я это почему спросил вообще, чтобы избежать переполнения буфера, т.е. чтобы не записывался нуль за пределом MAX_PATH.. |
Автор: Dmitry_177 21.5.2007, 14:45 |
Я где-то слышал что, когда выполняется SetLength(str, MAX_PATH), для str резервируется MAX_PATH+1 байт. Лишний байт - это как раз для нулевого символа в конце, который при обычной работе со stringом добавляется автоматически.. Правда ли это? |
Автор: Alexeis 21.5.2007, 14:54 | ||
|
Автор: Dmitry_177 21.5.2007, 15:17 |
Alexeis, да, но если задаем размер строки MAX_PATH символов, и API функция передаст в нее ровно MAX_PATH символов.. получится так что нулевой символ туда уже не запишется.. Вот я и спрашиваю нужноли MAX_PATH +1 делать? И еще: Я где-то слышал что, когда выполняется SetLength(str, MAX_PATH), для str резервируется MAX_PATH+1 байт. Лишний байт - это как раз для нулевого символа в конце, который при обычной работе со stringом добавляется автоматически.. Правда ли это? |
Автор: Alexeis 21.5.2007, 15:22 |
Dmitry_177, для строки резервируется length(s) + 9 байт, 4 для счетчика ссылок 4 для длинны и 1 для завершающего нуля. |