Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизПравильно ли я работаю с PChar? Найти похожие ветки
← →
MegaVolt (2004-05-21 11:12) [0]Есть функция которя после своей работы возвращает PChar где я должен освобождать память?
function F1:PChar;
var P:PChar;
begin
P:=StrAlloc(...);
//заполнение P
...
Result:=P;
end;
procedure ...
var
temp:PChar;
begin
// Вызываем функцию
temp:=F1;
//А теперь что то делаем с temp
dispose(temp)
Правилен ли этот код?
← →
Тимохов © (2004-05-21 11:17) [1]если я не ошибаюсь парной к stralloc является функция strdispose. именно ей и надо освобождать.
← →
Romkin © (2004-05-21 11:18) [2]If space for a string is allocated with StrAlloc, it should be deallocated via StrDispose.
Так что dispose не подходит. А так код правильный, правда, гораздо лучше выделять память в том модуле, который ее и освобождает, меньше ошибок
← →
Романов Р.В. © (2004-05-21 11:18) [3]Не правильно. Память должна резервироваться во внешней функции, а F1 дожна только работать с ней.
← →
Digitman © (2004-05-21 11:19) [4]только не dispose(), а StrDispose()
в пределах одного и того же экз-ра менеджера памяти (к которому обращаются ф-ции (StrAlloc и StrDispose) код правилен
← →
MegaVolt (2004-05-21 11:21) [5]На счёт Dispose я описался :( Извините. Там действительно StrDispose :)
А если память выделять там где и убиваю то получается я создаю пустую строку передаю её параметром в функцию получаю её обратно и убиваю? А если размер не известен? Если он определяется только в функции то только так как у меня написано?
← →
Тимохов © (2004-05-21 11:23) [6]
> MegaVolt (21.05.04 11:21) [5]
подходов много. В winapi часто так:
1. Создавать/удалять должна вызывающая сторона.
2. При этом функции передается буфер и длина. Если мето недостаточно, то возвращается код ошибки.
3. В последнем случае вызывающая сторона должна позаботится об увеличении места и повторном вызове функции.
← →
Romkin © (2004-05-21 11:26) [7]Посмотри, многие функции winAPI принимают буфер, его размер и возвращают размер строки как результат. Хороший пример - GetWindowsDirectory, при подаче на вход nil и нулевого размера она просто вернет требуемый размер :))
Основная идея - создавай буфер любого размера, подавай туда. Потом смотри, какой размер вернуло...
Второй пример - пара GetWindowText & GetWindowTextLength, думаю, понятно, что каждая делает
← →
MegaVolt (2004-05-21 11:29) [8]Т.е. StrAlloc и StrDispose в одной функции а SetLength в другой? Так?
← →
Digitman © (2004-05-21 11:31) [9]
> MegaVolt
как вариант, можно одним из параметров передавать в ф-цию ссылку на структуру типа TMemoryManager (см. справку)
вызывающий код формирует структуру, заполняя ее поля адресами ф-ций, оперирующих "своим" экз-ром менеджера памяти в составе вызывающего модуля
вызываемый код, получив ссылку на структуру, обращается к заведомо корректной ф-ции аллокации памяти под возвращаемый рез-т
получив результат, вызывающий код столь же корректно освобождает память под результат вызовом ф-ции деаллокации "своего" экз-ра менеджера памяти
← →
MegaVolt (2004-05-21 11:41) [10]И ещё вопрос если я в функцию передаю PChar и хочу видеть результат на том же месте то передавать как var?
Function F1(var str:Pchar);
← →
Тимохов © (2004-05-21 11:46) [11]
> И ещё вопрос если я в функцию передаю PChar и хочу видеть
> результат на том же месте то передавать как var?
кроме символа "?" чем эта фраза похожа на вопрос?
← →
panov © (2004-05-21 11:48) [12]>MegaVolt (21.05.04 11:41) [10]
И ещё вопрос если я в функцию передаю PChar и хочу видеть результат на том же месте то передавать как var?
PChar - всего лишь указатель на область памяти, и передавать его как var-параметр нужно только в том случае, если есть необходимость работы с самим указателем, а не сдангными, на которые он указывает.
← →
MegaVolt (2004-05-21 11:53) [13]Спасибо понял :)
А в том что вопроса почти и нету так это потому что я просто уточняю. В хорошем вопросе на 60% есть ответ :) А у меня получился на 100% следовательно ответ true :):) Что то типа того а правда ли что А=А ответ true :)
← →
Anatoly Podgoretsky © (2004-05-21 12:05) [14]use of StrAlloc is in decline
StrDispose does nothing.
← →
MegaVolt (2004-05-21 12:08) [15]Извиняй я не савсем понял. Если я исспользую StrAlloc то StrDispose можно неприменять? Т.е. выделяю я сам а освобождает автомат?
← →
Anatoly Podgoretsky © (2004-05-21 12:14) [16]Обязательно должен использовать в паре, это правило для всех типов выделения памяти, не касается string там компилятор и система следит
← →
MegaVolt (2004-05-21 12:16) [17]Понятно. Спасибо большое всем кто потратил на меня время :):)
← →
Digitman © (2004-05-21 12:18) [18]
> MegaVolt
тебе вообще-то для чего все это нужно ?
если вызывающий и вызываемый код сверстан в одной и той же версии Делфи, то все эти заморочки никчему - просто формируй и возвращай обычным образом обычный String-тип, не забывая о едином менеджере с вызывающим кодом
если же вызывающий код планируется разрабатывать в иной языкой среде, то тогда параметр/результат типа PChar еще как-то оправдан, но - опять же - менеджер памяти, используемый для аллокации/деаллокации должен быть единым
← →
MegaVolt (2004-05-21 12:38) [19]Я исспользую PChar для работы с данными. Т.е. не как строку а как массивчик данных.
← →
McSimm © (2004-05-21 13:07) [20]
> Я исспользую PChar для работы с данными. Т.е. не как строку
> а как массивчик данных.
Использование String ничуть этому не помешает.
← →
Digitman © (2004-05-21 13:28) [21]
> Я исспользую PChar для работы с данными. Т.е. не как строку
> а как массивчик данных
в таком случае попросту неразумно задействовать именно этот указ.тип
type
PMyArray = ^TMyArray;
TMyArray = array[..] of чего_то;
вот этот самый тип PMyArray и пользуй для передачи параметра и/или возврата рез-та .. оно ж гораздо логичней и понятней !
← →
MegaVolt (2004-05-21 13:34) [22]Не так давно мне народ тут же на этом форуме убеждал что PChar как раз для этого и подходит :(
Это было в теме созданной мной называлась "Как преместить данные в буфер не с начала?" получается что в ней мне несовсем правильно всё рассказали?
← →
Digitman © (2004-05-21 13:46) [23]
> MegaVolt (21.05.04 13:34) [22]
я не в курсе, кто там, что и по какому поводу тебе рассказывал, правильно или неправильно ... приводи ссылку ...
ну а касаемо массива ...
это хорошо если у тебя массив байт - тогда обращение к i-му эл-ту массива сводится к простой конструкции
var
ArrayOfByte: PChar;
SomeByte: Byte;
...
SomeByte := Byte(ArrayOfByte[i]);
а если это dword-массив ?
сравни сам :
1.
PDword = ^DWord;
var
ArrayOfDWord: PChar;
SomeDWord: DWord;
...
SomeDWord := PDwordArray(@ArrayOfDWord[i * SizeOf(DWord)])^;
и
2.
PDWordArray = ^TDWordArray;
TDWordArray = array[..] of DWord;
var
ArrayOfDWord: PDWordArray;
SomeDWord: DWord;
...
SomeDWord := ArrayOfDWord[i];
какой вариант изящней и понятней ? разумеется 2-й !
← →
MegaVolt (2004-05-21 14:22) [24]Изящней :) Согласен.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.026 c