-
speller (31.08.08 11:17) [140]На самом деле странно что вроде всё в юникоде, а ord на русской букве возвращает ascii значение. Или я просто чем-то не проникся?
-
speller (31.08.08 11:18) [141]что выдаст ord('я') на компе индуса?
-
@!!ex © (31.08.08 11:23) [142]> [141] speller (31.08.08 11:18)
Я так понимаю - зависит о того, в какой кодировке передана буква 'я'.
Не вижу проблемы. -
Anatoly Podgoretsky © (31.08.08 11:26) [143]Код русской буквы "я", в соответствии с кодировкой.
> ord('я')
Откуда код? По всей видимости это в ANSI -
speller (31.08.08 11:30) [144]
> зависит о того, в какой кодировке передана буква
Вне зависимости, в какой кодировке исходник, ascii или utf-8, результат ord('я') = 255. Т.е. компилятор во время компиляции делает преобразование из юникода в ascii. Что он сделает если буквы "я" нет в локали индуса? Подставит значение юникода и в результате получится ord('я') = 1103? -
Loginov Dmitry © (31.08.08 12:27) [145]а что там сейчас с длинными комментами на русском?
-
speller (31.08.08 14:14) [146]а что было?
-
ggg (31.08.08 14:28) [147]Да не обязательно с комментариями. Если в строке были русские символы, то экран "уезжал" вправо пропорционально их количеству, а курсор оставался где-то слева, за границей области видимости.
Всё-таки как-то не убедительно с Ord :) Похоже, в случае с Ord('я') просто компилятор подставляет константу. Может для чистоты эксперимента попробуете строку взять из элемента формы? -
В связи с тестированием Delphi2009 столкнулся с проблемкой, которой никак не могу найти удовлетворительного на мой взгляд решения.
Ранее пользовался функций:function InetAddr(const AHost: string): integer;
var
PHost:PChar;
HostEnt: PHostEnt;
begin
if AHost = '' then
result := INADDR_NONE
else
begin
PHost := PChar(AHost);
Result := inet_addr(PHost);
if Result = INADDR_NONE then
begin
HostEnt := GetHostByName(PHost);
if HostEnt <> nil then
Result := integer(pointer(HostEnt^.h_addr^)^);
end;
end;
end;
Функция прекрасно работала, пока string не превратился в WideString, а PChar в PWideChar. Хорошо, подумал я и поменял:function InetAddr(const AHost: AnsiString): integer;
var
PHost: PAnsiChar;
HostEnt: PHostEnt;
begin
if AHost = '' then
result := INADDR_NONE
else
begin
PHost := PAnsiChar(AHost);
Result := inet_addr(PHost);
if Result = INADDR_NONE then
begin
HostEnt := GetHostByName(PHost);
if HostEnt <> nil then
Result := integer(pointer(HostEnt^.h_addr^)^);
end;
end;
end;
Вроде бы все верно и действительно функция прекрасно работает в D7, но не работает в D2009, будучи вызвана, например, так:procedure TForm1.FormCreate(Sender: TObject);
begin
WSAStartup($101, WSA);
caption := inttostr(InetAddr('ya.ru'));
end;
В функцию, как мне кажется передается строка, но строка по-видимому становится WideString, хотя у меня в параметрах функции указано AnsiString и никаких сообщений компилятор не выдает. Странно как то.
Как бы мне заставить это работать в обеих версиях делфи? -
Наше проблему, дело оказалось не в WideString
Переделал так:function InetAddr(const AHost: AnsiString): DWORD;
var
PHost: PAnsiChar;
HostEnt: PHostEnt;
begin
if AHost = '' then
result := INADDR_NONE
else
begin
PHost := PAnsiChar(AHost);
Result := inet_addr(PHost);
if Result = INADDR_NONE then
begin
HostEnt := GetHostByName(PHost);
if HostEnt <> nil then
Result := DWORD(pointer(HostEnt^.h_addr^)^);
end;
end;
end;
в файле Winsock поменялось INADDR_NONE = -1; на INADDR_NONE = DWORD($FFFFFFFF); -
федот (31.08.08 22:21) [150]это правильно, смотрите варнинги, которые есть.
-
> федот (31.08.08 22:21) [150]
варнинг только в D2009 появлялся, в D7 его не было, я поэтому как то среди прочих сообщений не обратил внимания сразу на него. -
чтобы без варнингов работало в обеих версиях, пришлось исправить:function InetAddr(const AHost: AnsiString): DWORD;
var
PHost: PAnsiChar;
HostEnt: PHostEnt;
begin
if AHost = '' then
result := DWORD($FFFFFFFF)
else
begin
PHost := PAnsiChar(AHost);
Result := inet_addr(PHost);
if Result = DWORD($FFFFFFFF) then
begin
HostEnt := GetHostByName(PHost);
if HostEnt <> nil then
Result := DWORD(pointer(HostEnt^.h_addr^)^);
end;
end;
end; -
федот (01.09.08 20:15) [153]Новый билд 12.0.3163.16897, чую релиз.
-
oxffff © (01.09.08 21:17) [154]Намек понят.
-
Не не буду качать опять 600 мег. Теперь только релиз.
-
oxffff © (01.09.08 21:35) [156]Найден первый баг
TGenericRecord <T>: record = record
procedure DoSomething(aParam: T);
end;
procedure TForm1.FormCreate(Sender: TObject);
var a:TGenericRecord<integer>;
b:integer;
begin
a.DoSomething(5);
end;
procedure TGenericRecord<T>.DoSomething(aParam: T);
var a:integer;
begin
a:=integer((@aParam)^); // Он здесь, привет EDX регистру
showmessage(inttostr(a));
end;
:( -
oxffff © (01.09.08 21:38) [157]
> федот (01.09.08 20:15) [153]
> Новый билд 12.0.3163.16897, чую релиз.
Неа, я теперь стал ожидать множество сервис паков.
Просто огромное количество.
Честно говоря нельзя быть настолько небрежным в отношении реализации языка. -
oxffff © (01.09.08 21:43) [158]Приколько.
Я тут несколько высказался "демократично" насчет их реализации, я их не оскорблял, просто указал на некоторые изъяны.
Теперь. Очередной комментарий
Sergey Antonov Says: Your comment is awaiting moderation.
Повторяю в моих постах не было оскорблений, просто голые факты.
Интересно это связано как то с их оценкой роли России в мироустройстве. -
jack128_ (01.09.08 22:59) [159]
> Найден первый баг
в версии 12,0,3128,15596 все нормально..