Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-83013
Lendl
2002-09-25 12:48
2002.11.25
Работа с USB


3-82676
=SOFT=
2002-11-06 18:40
2002.11.25
interbase 6 - Помогите пожалуйста !!!!!


1-82748
iNew
2002-11-15 09:13
2002.11.25
Качаю файл по протоколу Zmodem, используя компоненту Async32


14-82933
to666a
2002-11-05 20:34
2002.11.25
сообщения


1-82685
Evyshka
2002-11-13 09:55
2002.11.25
Как вытащить текущий год ? :-))





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский