Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.23;
Скачать: 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 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.011 c
15-1286310553
Юрий
2010-10-06 00:29
2011.01.23
С днем рождения ! 6 октября 2010 среда


2-1288388349
Германн
2010-10-30 01:39
2011.01.23
Запрет запуска второго экземпляра приложения


2-1288051827
demon
2010-10-26 04:10
2011.01.23
Как все цифры в RichEdit покрасить в другой цвет?


2-1288253719
noob_one
2010-10-28 12:15
2011.01.23
Не пойму пределение типа. Объясните, пожалуйста.


15-1286134332
NailMan
2010-10-03 23:32
2011.01.23
Полетал сегодня с камерой на хвосте