Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1085294146
Alex
2004-05-23 10:35
2004.06.06
как напечатать апостроф?


3-1084444960
Voland777
2004-05-13 14:42
2004.06.06
Как управлять Hint - ами веток TTreeView ???


14-1084568689
Феликс
2004-05-15 01:04
2004.06.06
Защита excelевского файла


14-1084525933
Димаска
2004-05-14 13:12
2004.06.06
Радиолюбителям


1-1085333904
k@rt
2004-05-23 21:38
2004.06.06
Куда пропадают сиволы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский