• 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('я') просто компилятор подставляет константу. Может для чистоты эксперимента попробуете строку взять из элемента формы?
  • DVM © (31.08.08 21:56) [148]
    В связи с тестированием 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 и никаких сообщений компилятор не выдает. Странно как то.
    Как бы мне заставить это работать в обеих версиях делфи?
  • DVM © (31.08.08 22:17) [149]
    Наше проблему, дело оказалось не в 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]
    это правильно, смотрите варнинги, которые есть.
  • DVM © (31.08.08 22:24) [151]

    > федот   (31.08.08 22:21) [150]

    варнинг только в D2009 появлялся, в D7 его не было, я поэтому как то среди прочих сообщений не обратил внимания сразу на него.
  • DVM © (31.08.08 22:27) [152]
    чтобы без варнингов работало в обеих версиях, пришлось исправить:

    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]
    Намек понят.
  • DVM © (01.09.08 21:19) [155]
    Не не буду качать опять 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 все нормально..
Есть новые Нет новых   [134442   +15][b:0.001][p:0.003]