Вниз
Скачать: CL | DM;

Delphi 2009 и PAnsiChar   Найти похожие ветки 

← →
Unknown_user   (2010-10-31 23:36) [0]

Как правильно преобразовать тип string в PAnsiChar в Delphi 2009?


← →
Andy BitOff ©   (2010-10-31 23:52) [1]

http://tinyurl.com/35mzhfl


← →
Unknown_user   (2010-11-01 01:00) [2]

Typecast сделать не проблема. Я понимаю как. Но вот что из этого вышло, мне непонятно.

function StrToAnsiChar(S: string): PAnsiChar;
begin
Result := PAnsiChar(AnsiString(S));
end;

procedure TForm8.FormCreate(Sender: TObject);
var
S1, S2: PAnsiChar;
begin
S1 :=StrToAnsiChar("12345");
S2 :=StrToAnsiChar("ABCDE");
ShowMessage("S1=" + S1 + #13#10 + "S2=" + S2)
end;


Результат работы:

S1 = "ABCDE"
S2 = "ABCDE"

Строка S1 вместо значения "12345" содержит значение, которое назначалось второй строке.

Объясните мне пожалуйста сей феномен.


← →
Unknown_user   (2010-11-01 01:03) [3]

Если выполнять typecast без вызова своей функции

S1 :=PAnsiChar(AnsiString("12345"));
S2 :=PAnsiChar(AnsiString("ABCDE"));

То каждая строка содержит свое правильное значение.


← →
Anatoly Podgoretsky ©   (2010-11-01 01:07) [4]

> Unknown_user  (01.11.2010 01:00:02)  [2]

Выкинь функцию StrToAnsiChar и делай преобразование, прямо в коде

S1 := PAnsiChar(AnsiString("12345"));


← →
Anatoly Podgoretsky ©   (2010-11-01 01:09) [5]

Дело в том, что ты не понимаешь как работаю строки, что у них время жизни ограничено и управляется системой.


← →
Unknown_user   (2010-11-01 01:28) [6]

>Anatoly Podgoretsky

Я знаю про счетчики ссылок и автоматическое управление временем жизни строк. Знаю, что при назначении S1 := S2 никакого копирования памяти не происходит пока значение S1 не будет изменено. Но в чем разница между

S1 := PAnsiChar(AnsiString("12345"));

и вызовом функции

S1 := StrToAnsiChar("12345");

которая выполняет то же самое действие, понять не могу.

От функции не могу отказаться, так как в скором времени надо будет кроме преобразования строковых типов добавить в нее конвертацию в UTF-8 формат.

Эта функция должна получать на входе UnicodeString тип Delphi 2009 а возвращать PAnsiChar - текстовый буфер в UTF-8 кодировке.


← →
Юрий Зотов ©   (2010-11-01 01:54) [7]


> Unknown_user   (01.11.10 01:28) [6]
> Но в чем разница между
> S1 := PAnsiChar(AnsiString("12345"));
> и вызовом функции
> S1 := StrToAnsiChar("12345");
> которая выполняет то же самое действие, понять не могу.
>

Не то же самое. В первом случае просто присваивается адрес, а во втором идет передача адреса через стек.


← →
Servy ©   (2010-11-01 02:05) [8]


> Эта функция должна получать на входе UnicodeString тип Delphi
> 2009 а возвращать PAnsiChar - текстовый буфер в UTF-8 кодировке.
>


Если вы возвращаете указатель (а PAnsiChar ни что иное, как указатель) на буфер - то сей буфер должен быть кем-то потом прибран. Так что, если так необходимо возвращать PAnsiChar - выделяйте память ручками и не забывайте ее освобождать потом. Хотя, куда проще возвращать AnsiString, а в том месте, где его необходимо передавать далее - приводить к типу PAnsiChar. Очевидно, что в этом случае за выделением и освобождением памяти проследит делфи.

Касательно примера с функцией - наружу возвращается указатель (PAnsiChar), которому присвоено значение неявной локальной переменной (AnsiString), которая при выходе за пределы видимости перестает существовать. Так делать не стоит :).


← →
Eraser ©   (2010-11-01 02:40) [9]

http://edn.embarcadero.com/article/38446
http://edn.embarcadero.com/article/38582
http://edn.embarcadero.com/article/38703


← →
Anatoly Podgoretsky ©   (2010-11-01 07:42) [10]

> Unknown_user  (01.11.2010 01:28:06)  [6]

А то, что во втором случае строка прекращает жить по выходу из функции.
И тебе везет, что ты АV не получил, строки то уже нет


← →
Unknown_user   (2010-11-01 11:01) [11]

Всем спасибо за разъяснения. В заблуждение ввела та легкость с которой делфи преобразовывает PChar в string и наоборот.

Я недавно перешел на Delphi 2009. Читал про unicode строки. Нигде не нашел информацию.
 
var
 S: string;
 Bytes: TBytes;
begin    
 S := "123";
 Bytes := TEncoding.Convert(TEncoding.Unicode, TEncoding.Default, BytesOf(S));
 Result := StringOf(Bytes);
end;

Объясните, пожалуйста как это работает. Если строки в D2009 юникодовские, формат UCS2, то есть минимум 2 байта на символ. То почему преобразование в массив байтов функцией BytesOf мне возвращает только 3 байта для строки "123". И это как раз ASCII коды символов строки. Получается что BytesOf неявно выполняет преобразование в AnsiString?


← →
Игорь Шевченко ©   (2010-11-01 11:44) [12]


> То почему преобразование в массив байтов функцией BytesOf
> мне возвращает только 3 байта для строки "123".


потому что TEncoding.Default ?


← →
Unknown_user   (2010-11-01 11:53) [13]

Так Source ведь TEncoding.Unicode. То есть записано преобразование из юникода в анси, с кодовой страницей, используемой по умолчанию. Или я что-то путаю?


← →
clickmaker ©   (2010-11-01 12:04) [14]

WideBytesOf()


← →
Игорь Шевченко ©   (2010-11-01 12:24) [15]


> То есть записано преобразование из юникода в анси


ну да.


> То почему преобразование в массив байтов функцией BytesOf
> мне возвращает только 3 байта для строки "123". И это как
> раз ASCII коды символов строки


вот поэтому


← →
Anatoly Podgoretsky ©   (2010-11-01 12:55) [16]


> преобразование из юникода в анси

И чего тогда обижаешься?


← →
Unknown_user   (2010-11-01 13:27) [17]

>clickmaker

Спасибо, невнимательно читал документацию по BytesOf.



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

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.005 c
2-1288280931
Aleks
2010-10-28 19:48
2011.01.23
Программа-ценник


2-1288624179
cyber-pilot
2010-11-01 18:09
2011.01.23
Как перехватить вставку из буфера в комбобокс?


15-1286722664
AlexDn
2010-10-10 18:57
2011.01.23
Gif анимтор..


2-1288273897
JEDI
2010-10-28 17:51
2011.01.23
Проблема с QuickReport


15-1286569751
Юрий
2010-10-09 00:29
2011.01.23
С днем рождения ! 9 октября 2010 суббота




   Наверх