Текущий архив: 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