![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с PChar средствами Windows (API) [D2005, XP]
Max_2006 © (2006-11-05 12:38:00)как работать с PChar в Delphi средствами Windows, т.е. API? Т.е. надо например воспользоваться API функцией GetSystemDirectory, что делать если после ее выполнения нужно выполнить что-то вроде SetLength(p, Length(p)); т.е. длина строки ранв MAX_PATH, после выполнения функции GetSystemDirectory, как обрезать строку?
var
p: PChar
begin
GetMem(p, MAX_PATH);
GetSystemDirectory(p, MAX_PATH);
...
FreeMem(p);
Работу со String и ShortString не предлагайте...
Германн (2006-11-06 02:09:00) [1]
> Я просто где-то видел что @S[1] так лучше, или это не так?
:-)
Max_2006 (2006-11-06 00:17:00) [2]Я буду со строками работать, просто интересно стало это насчет массива...
Anatoly Podgoretsky (2006-11-06 00:08:00) [3]> Ketmar (05.11.2006 23:00:41) [41]
Затем, что мы простых путей не ищем.
Anatoly Podgoretsky (2006-11-05 23:59:00) [4]> Max_2006 (05.11.2006 22:45:40) [40]
Используй строки, их элементарно расширять и сжимать
-
Ketmar (2006-11-05 23:00:00) [5]а зачем???
Max_2006 (2006-11-05 22:45:00) [6]А если нужно расширить массив? т.е. есть массив array [0..20] of Char и он весь занят и его надо расширить, то всеравно надо создавать новый и делать move?
Max_2006 (2006-11-05 22:23:00) [7]
> Никаких копирований ВинАПИ не делает.
А я вообще про строку имел ввиду...
Anatoly Podgoretsky (2006-11-05 20:10:00) [8]> Max_2006 (05.11.2006 18:10:34) [34]
Никаких копирований ВинАПИ не делает.
Leonid Troyanovsky (2006-11-05 18:34:00) [9]
> Max_2006 (05.11.06 17:50) [32]
> Я тут еще так подумал, может string передавать в функцию
> требующая PChar так: Pointer(str)? или всеже лучше PChar(str)?
From Delphi help: Long string types:
It is also possible to typecast a long string to an untyped pointer, using the
syntax Pointer(S), where S is a long string expression. A Pointer typecast
returns the address of the first character of the long string value. Unlike a PChar
typecast, a Pointer typecast returns nil if the string expression is empty.
--
Regards, LVT.
sniknik (2006-11-05 18:24:00) [10]> Т.е. быстрее чем приложение написанное на C++???
очень часто да быстрее, и намного (очень намного). имею под боком трех С-шников, есть прецеденты.
> Все же я не очень понимаю чем string выигрывает по скорости массив array [0..MAX_PATH] of Char
массиву ничем, для доступа, для копирования - не придётся узнавать размер строки, копирование можно сделать одной ассемблерной командой, в случае массива (вернее z терминированной строки) чтобы узнать размер придётся ее сканировать, или если делать условие на конечный 0 прям в копировании то все одно придётся делать циклом, кучей команд переноса и проверкой в цикле на 0... одна команда на все копирование 2 такта (примерно естественно), против кучи на каждый перенесённый байт и проверку, на все те же 2 такта... на каждую команду... считай. а лучше читай, найди чего нибудь для начинающих и просто выучи наизусть (по другому видно не доходит).
Ketmar (2006-11-05 18:22:00) [11]>[34] Max_2006 5-Nov-2006, 18:10
один фиг.
Max_2006 (2006-11-05 18:10:00) [12]Все же я не очень понимаю чем string выигрывает по скорости массив array [0..MAX_PATH] of Char, если выполнять с массивом какиенибудь действия то его придется копировать в новую память и т.д. А как тогда устроен string, я понимаю что по сути дела это только указатель, но а если строка все больше и больше становится, растет так сказать, то по идее память должна как-то динамически увеличиваться или как? Если динамически то на это тоже не мало времени тратится...
Anatoly Podgoretsky (2006-11-05 17:57:00) [13]> Max_2006 (05.11.2006 17:50:32) [32]
Ну и прикинь, что у тебя получится для пустой строки.
Не надо фантазировать, делай правильно, кроме тех случаев когда ты точно
знаешь зачем ты это Pointer(str) делаешь
Max_2006 (2006-11-05 17:50:00) [14]Я тут еще так подумал, может string передавать в функцию требующая PChar так: Pointer(str)? или всеже лучше PChar(str)?
Anatoly Podgoretsky (2006-11-05 17:41:00) [15]Не всегда, но в основном, поскольку оно обладает информацией о размере, а для PChar такой информации нет. А они с ним и работают.
А что тебя так удивляет, что С++ обладает каким то тайным знанием, там даже цикла FOR нет, под его именем идет цикл WHILE. Так же нет массивово в чистом виде, это замаскированый указатель.
И все что касается циклов и строк как правило работает медлеенне.
Ты не читай заверения маркетологов от С++
Max_2006 (2006-11-05 17:37:00) [16]а как тогда работают в C++ с WinAPI? Там же нету string.. Если только в MFC на сколько я знаю CString (как-то так называется)... а если без MFC(на одном WinAPI), как они используют строки? Судя из цитаты:
> Не хочешь тратить время на приведение, потеряешь время и
> память на работу с динамическим выделением, при том потеряешь
> больше и ничего не приобретешь.
получается так что приложение написанное с использованием string быстрее работает чем с PChar? Т.е. быстрее чем приложение написанное на C++???
Anatoly Podgoretsky (2006-11-05 17:09:00) [17]> Max_2006 (05.11.2006 17:03:28) [28]
string полностью совместим с PChar, имеет дополнительные
средства, управляющие его живучестью, уменьшае количество
ошибок, начинающим очень сложно работать с указателями,
с динамическим выделением памяти. Нет ни каких оснований
не использовать. Не хочешь тратить время на приведение, п
отеряешь время и память на работу с динамическим выделени
ем, при том потеряешь больше и ничего не приобретешь.
Max_2006 (2006-11-05 17:03:00) [18]Я просто хотел научиться писать программы на одном API, а так как там PChar то его и использовать без использования string, чтобы не тратилось время на перевод string в PChar...
Anatoly Podgoretsky (2006-11-05 16:20:00) [19]> Max_2006 (05.11.2006 16:09:26) [26]
Так и это ты должен был понять из сообщения об ошибке.
А лучше или нет - читай обсуждения, их тут два по этой теме.
Понять ты должен сам, тогда навечно, по крайней мере до смены парадигмы.
Max_2006 (2006-11-05 16:09:00) [20]N := GetSystemDirectory(PChar(S), MAX_PATH); так? Я просто где-то видел что @S[1] так лучше, или это не так?