Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Правильно ли я работаю с 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
1-1085581049
ceval
2004-05-26 18:17
2004.06.06
при нажатии кнопки Ffind-форма закрывалась и остался MessageBox


14-1084636596
KLAUS
2004-05-15 19:56
2004.06.06
Помогите реализовать код с использование MD5


1-1085429123
Serious Sam
2004-05-25 00:05
2004.06.06
Заливка и плавная смена цветов


4-1083538982
Equillibrium
2004-05-03 03:03
2004.06.06
Как динамически создавать TrackBar (ползунок)


14-1084967317
AlexG
2004-05-19 15:48
2004.06.06
Кому нужны лодочные моторы?