Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Вниз
Выделение и освобождение памяти под 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.022 c