Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.02;
Скачать: CL | DM;

Вниз

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

 
berrometr   (2008-09-26 21:36) [0]

начал тестировать, хотел посмотреть что там в буфере будет при юникоде. непонятная закономерность, например при данной строке вылетает acces, проверьте плиз у кого 2009

procedure TForm1.Button1Click(Sender: TObject);
var
b: PChar;
i, len: integer;
s: string;
h: Integer;
begin

 s:= "1йцуукqwer111";
 len:= system.Length(s);
 getMem(b, len);

 for i := 0 to len - 1 do b[i]:= s[i+1];

 s:="";
 for i := 0 to len - 1 do begin
    s:= s + b[i];   //  <- ошибка на тором проходе Acces
 end;

 ShowMessage(s);
 FreeMem(b);
end;

в чем тут может быть проблема?
при AnsiString PAnsiChar нормально...


 
Palladin ©   (2008-09-26 21:44) [1]

проблема в том, что сверхразумные существа думают, что в юникоде один символ - один байт.... и сверхразумность их опускается... ну... туда где не светит солнце...


 
sniknik ©   (2008-09-26 21:44) [2]

> в чем тут может быть проблема?
символ юникод 2 байта, простой 1 , одно и то же количество символов в разных строках = разное количество необходимой памяти под них.
getMem(b, len * 2);


 
Eraser ©   (2008-09-26 21:47) [3]

> [0] berrometr   (26.09.08 21:36)

http://dn.codegear.com/article/38446
http://dn.codegear.com/article/38582
http://dn.codegear.com/article/38703

читать до полного просветления.


 
berrometr   (2008-09-26 22:27) [4]

да понятно что два байта...
ну а вот скажите тогда, почему при  s:= "йцуукqwer111";  все нормально отрабатывается?


 
Palladin ©   (2008-09-26 22:42) [5]

мда... там солнце светить еще долго не собирается


 
berrometr   (2008-09-26 22:44) [6]

Palladin ©, так может быть все таки скажешь почему исключение в последнем случаи не вылетает?


 
DVM ©   (2008-09-26 22:47) [7]


> getMem(b, len * 2);

не так не хорошо, надо Len * SizeOf(Char).


 
berrometr   (2008-09-26 22:50) [8]

а ещё лучше Len * StringElementSize(s)

и вообще юникод может быть и 1 байта и более 2..
но я не про это, я про исключение..


 
Palladin ©   (2008-09-26 23:07) [9]

прокомментируй каждый шаг приведеного кода и укажи где по твоему мнеию бред


 
berrometr   (2008-09-26 23:16) [10]

да весь код бред)
тормознул просто, видать короткая строка не затирает память до исключения)

Eraser © ,  спасибо за ссылки!


 
Palladin ©   (2008-09-26 23:22) [11]


> да весь код бред)

:) и все таки свет пробился сквозт щели



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1222342938
HairBack
2008-09-25 15:42
2008.11.02
Вопрос по TThread


2-1222065054
Sten
2008-09-22 10:30
2008.11.02
Поиск


1-1197305735
Asker
2007-12-10 19:55
2008.11.02
Копирование экрана


2-1222422249
СуперЧайник
2008-09-26 13:44
2008.11.02
Помогите


15-1221108426
Cyrax
2008-09-11 08:47
2008.11.02
Терминатор 2 3D - Битва сквозь время: фрагмент с T1000000