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

Вниз

Выделение и освобождение памяти под PChar   Найти похожие ветки 

 
Zn   (2002-11-14 10:31) [0]

Help me, please! Как корректно выделить и освободить память под PChar? Объем заранее неизвестен. Простите за тривиальный вопрос...


 
Calm ©   (2002-11-14 10:37) [1]

Почему-то мне кажется, что delphi сама освободит...

А если насильственно, то считаем количество символов, пока не встретим символ #0. И освобождаем, не забывая, что и под нулевой символ нужно тоже осовободить память.


 
Ru ©   (2002-11-14 10:38) [2]

если не ошибаюсь освобождение
p:pchar;
...
p:=nil;


 
Calm ©   (2002-11-14 10:38) [3]

А выделять память зачем?

var
MyChars:PChar;
begin
...
MyChars:="Hello word!";
...
end;


 
Alx2 ©   (2002-11-14 10:43) [4]

>Zn (14.11.02 10:31)
Не иди на геморрой.
Используй String и приведение типов к PChar. Delphi остальное все сделает


 
Zn   (2002-11-14 10:45) [5]

Перепробовал все эти варианты. Постоянно пишет "Invalid pointer operation". Не пойму в чем дело.


 
Calm ©   (2002-11-14 10:46) [6]


> Не иди на геморрой.
> Используй String и приведение типов к PChar. Delphi остальное
> все сделает

Действительно :)
Вот правда, если нужно написать какую-нибуль dll, то иногда без PChar трудно :(


 
Calm ©   (2002-11-14 10:47) [7]

А
> Перепробовал все эти варианты. Постоянно пишет "Invalid
> pointer operation". Не пойму в чем дело.

А конкретно, какие варианты (код)?


 
Zn   (2002-11-14 10:56) [8]

function U866(var InpStr: PChar): PChar;
var i,z : Word;
ps: PChar;
begin
New(Result);
New(ps);
z:=Length(InpStr)-1;
for i:=0 to z do
begin
ps^:=InpStr[i];
case ps^ of
"в": Result:=strcat(Result,"


 
Calm ©   (2002-11-14 11:08) [9]

Zn, страшные вещи пишите :)
А что, без PChar точно нельзя?


 
Alx2 ©   (2002-11-14 11:10) [10]

>Zn (14.11.02 10:56)
Извини, но это бред.
Ты хочешь конвертер OemToAnsi написать?


 
Reindeer Moss Eater   (2002-11-14 11:11) [11]

Так ты вернул PChar, а потом освободил память, не которую он указывал.


 
Skier ©   (2002-11-14 11:12) [12]

>Zn

> Как корректно выделить и освободить память под PChar? Объем
> заранее неизвестен


Ну ежели объём заранее неизвестен, то можно просто кастингом
Что то типа :

APCharVar := PChar(AStringVar);

А вообще при выделении и освобождении памяти спасает
AllocMem(...) и FreeMem(...)


 
Zn   (2002-11-14 11:12) [13]

Всё это будет сидеть DLL. Просто нужно перекодировать некоторые символы. Функцию будут использовать приложения Delphi и VB.


 
Reindeer Moss Eater   (2002-11-14 11:13) [14]

Так ты вернул PChar, а потом освободил память, не которую он указывал.


 
Zn   (2002-11-14 11:21) [15]

>Reindeer Moss Eater (14.11.02 11:13)
>Так ты вернул PChar, а потом освободил память, не которую он >указывал.

Т.е.? Освободил память под локальную переменную, которая, в принципе, и сама бы должна. А я для перестраховки. Просто с указателями не очень дружу.




 
Alx2 ©   (2002-11-14 11:22) [16]

>Zn (14.11.02 11:12)
>Всё это будет сидеть DLL. Просто нужно перекодировать некоторые
>символы. Функцию будут использовать приложения Delphi и VB.

Просто перекодируем тогда по твоим мотивам:

Function U866(Const InpStr: PChar): PChar;
Var I : Integer;
Begin
Result := InpStr;
For I := 0 To StrLen(InpStr) - 1 Do
Case InpStr[I] Of
"в": Result[I] := "


 
Reindeer Moss Eater   (2002-11-14 11:23) [17]

Dispose(ps) - это убиение строки, которую ты так заботливо собирал внутри функции


 
Alx2 ©   (2002-11-14 11:24) [18]

>Alx2 © (14.11.02 11:22)
Кстати, InpStr=Result после отработки ф-ии


 
Ru ©   (2002-11-14 11:26) [19]

>Zn (14.11.02 11:12)

слепой вася спокойно передает в дельфи строку:
declare function myfunc (byval st as string) as string
теперь в длл спокойно пишем:
function U866(var InpStr: string): PChar;
работаем с какой-либо внутренней переменно типа string, а в конце функции пишем:
result:=pchar(IntrStr);
во всяком случае для ворд васика прокатит.


 
icWasya ©   (2002-11-14 11:27) [20]

Если посмотришь описание Windows процедур, которые используют PChar, то увидишь, что если процедура возвращает строку то она имеет приблизительно такое описание:

integer GetAnyThing(Buf:PChar;integer LenBuf);
то есть вызывающая программа заказывает массив под возвращаемую строку и передаёт процедуре размер массива и указатель на него,
а возвращает реальный размер записанных данных.

в данном случае код должен быть примерно таким:

function U866(InpStr: PChar;OutStr: PChar;OutLen:Integer):PChar;
var i,z : Word;
s: Char;
ps: PChar;
begin
i:=0;z:=0;
Result:=OutStr;
ps:=OutStr;

while InpStr[i]<>#0 do
begin
s:=InpStr[i];
case s of
"в": s:="|";
"б": s:="


 
Zn   (2002-11-14 11:33) [21]

<слепой вася спокойно передает в дельфи строку:
<declare function myfunc (byval st as string) as string
<теперь в длл спокойно пишем:
<function U866(var InpStr: string): PChar;
<работаем с какой-либо внутренней переменно типа string, а в <конце функции пишем:
<result:=pchar(IntrStr);
<во всяком случае для ворд васика прокатит.

Это я пробовал. Не работает.


 
Alx2 ©   (2002-11-14 11:36) [22]

>Zn (14.11.02 11:33)
>Это я пробовал. Не работает.
А мои посты тебе ничего не рассказали?


 
Zn   (2002-11-14 11:36) [23]

Alx2 и icWasya! Благодарю за подсказку, сейчас попробую!


 
Zn   (2002-11-14 12:34) [24]

Alx2! Ваш код работает отлично, но на последне строке функции (end;) выдает "Invalid pointer operation". Хотя дальше возвращаемое значение садится куда надо и родительская программа продолжает работать.


 
Alx2 ©   (2002-11-14 13:04) [25]

>Zn (14.11.02 12:34)
как полностью объявлена ф-я в dll и как в родительской программе?


 
Zn   (2002-11-14 14:01) [26]

>Alx2 © (14.11.02 13:04)
>как полностью объявлена ф-я в dll и как в родительской программе?

Идентично.
function U866(var InpStr: PChar): PChar;
Пытался вставлять в объявления stdcall, pascal или register - безрезультатно.


 
Alx2 ©   (2002-11-14 14:05) [27]

>Zn (14.11.02 14:01)
>Пытался вставлять в объявления stdcall, pascal или register -
>безрезультатно.
Главное, чтобы в хосте и в dll спецификаторы вызова (stdcall, pascal или register) совпадали.
На всякий случай воткни в секцию uses модуль sharemem на первое место в dpr файле и в головном файле библиотеке. Из других мест (если есть) его выкинь.

PS
Вообще говоря, вслепую проблематично дебагить :)



Страницы: 1 вся ветка

Текущий архив: 2002.11.25;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
8-82874
dimushkin
2002-07-26 14:16
2002.11.25
Вопрос про DirectDraw ..


14-82948
Феликс
2002-11-05 21:48
2002.11.25
Сайт, где можно скачать книги?


3-82665
kern
2002-11-06 12:21
2002.11.25
SQL


1-82752
Lola
2002-11-13 13:29
2002.11.25
Печать из QReport в RTF-файл.


3-82634
iKS1
2002-11-05 16:42
2002.11.25
API