Сравнение PChar

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Сравнение PChar

Сообщение Sergei I. Gorelkin » 23.04.2013 09:57:54

Обеспечиваются за исключением констант типа shortstring.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Сравнение PChar

Сообщение debi12345 » 23.04.2013 10:08:29

завершающие #0 у строковых констант обеспечиваются компилятором (пример из fpc 2.6.0)

Точно, забыл :) Может в 2.7.х это убрали ?

shortstring.

На тест не влияет :) фпц-2.6.0

Добавлено спустя 44 минуты 22 секунды:
Хм, похоже что фпц 2.6 в любом режиме (турбо, дельфи, обджпас,.) любые строковые константы, имеющие присвоения в коде и посталвяющие аргументы в функции - предваряет длиной и завершает нулем.
А как в НЕконстантными приcвоениями PChar=AnsiString[1] в обход StrPCopy ? Это всегда надежно ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Сравнение PChar

Сообщение Sergei I. Gorelkin » 23.04.2013 10:58:39

Ansistring, Widestring, Unicodestring - всегда автоматически завершаются нулем.
Shortstring - не завершается.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Сравнение PChar

Сообщение bormant » 23.04.2013 11:04:55

Для операций с короткими строками ($H-, string) как с ASCIIZ, несмотря на наличие у строковой константы завершающего #0, дополнительный завершающий #0 указывать придётся. Дело в том, что завершающий #0 строковой константы не входит в длину строки и дополнительно не обрабатывается (совместимость), соответственно, в короткую строку при её инициализации не копируется:
Код: Выделить всё
# s2 := 's2';
    movl    $U_P$PROGRAM$S2,%eax
    movl    $_$PROGRAM$_Ld3,%ecx
    movl    $255,%edx
    call    fpc_shortstr_to_shortstr
...
.section .data
.globl   _PROGRAM$_Ld3
_PROGRAM$_Ld3:
   .ascii  \002"s2\000"
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Сравнение PChar

Сообщение alexs » 23.04.2013 12:09:23

debi12345, bormant
Все тестилось в режиме {$H+}
Там string по умолчанию должен заканчиваться 0.
Я специально этот момент перепроверил - 0 присутсвует.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Сравнение PChar

Сообщение debi12345 » 23.04.2013 12:32:01

Я специально этот момент перепроверил - 0 присутсвует.

А как себя ведет AnsiStrComp на чистых (инициализированных константами) аргументах ? Тут либо она глючит, либо присвоение PChar:= String[1]. Пробовали вариант "выделение_памяти+StrPCopy" ?

Добавлено спустя 1 минуту 45 секунд:
Или все перевести на WideString+PWideChar ? Может какая-то фигня с локалями ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Сравнение PChar

Сообщение runewalsh » 23.04.2013 12:58:51

А валидныйЪ PChar вообще может быть nil'ом? Касты же никогда его не возвращают.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Сравнение PChar

Сообщение alexs » 23.04.2013 13:08:39

debi12345
Надо попробовать, но переписать не могу пока - я уже писал выше - этот код находится в ZEOS.
runewalsh
Ну как минимум функция олжна проверить коректность входных параметров.
И, кстати, в некоторых случаях оно работает правильно.
И в дельфи оно также работает нормально.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Сравнение PChar

Сообщение debi12345 » 23.04.2013 13:48:22

А валидный PChar вообще может быть nil'ом

Функция кажется проверяет - иначе бы "падала" на AV.

Добавлено спустя 1 минуту 39 секунд:
я уже писал выше - этот код находится в ZEOS.

Вообще странно, что их код в этом месте - не юникодный. И о чем только думают :?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Сравнение PChar

Сообщение bormant » 23.04.2013 14:25:05

Понимания для (fpc-2.6.2/rtl/objpas/sysutils/sysstr.inc:484):
Код: Выделить всё
function AnsiStrComp(S1, S2: PChar): integer;{$ifdef SYSUTILSINLINE}inline;{$endif}
  begin
    result:=widestringmanager.StrCompAnsiStringProc(s1,s2);
  end;

fpc-2.6.2/rtl/unix/cwstring.pp
Код: Выделить всё
function StrCompAnsi(s1,s2 : PChar): PtrInt;
  begin
    result:=strcoll(s1,s2);
  end;
...
      StrCompAnsiStringProc:=@StrCompAnsi;

fpc-2.6.2/rtl/win/sysutils.pp
Код: Выделить всё
function Win32AnsiStrComp(S1, S2: PChar): PtrInt;
  begin
    result:=CompareString(LOCALE_USER_DEFAULT,0,s1,-1,s2,-1)-2;
  end;
...
    widestringmanager.StrCompAnsiStringProc:=@Win32AnsiStrComp;

fpc-2.6.2/rtl/objpas/sysutils/sysstr.inc
Код: Выделить всё
function GenericAnsiStrComp(S1, S2: PChar): PtrInt;
begin
  Result:=0;
  If S1=Nil then
    begin
      If S2=Nil Then Exit;
      result:=-1;
      exit;
    end;
  If S2=Nil then
    begin
      Result:=1;
      exit;
    end;
  While (Result=0) and (S1^<>#0) and (S2^<>#0) do begin
    Result:=Ord(S1^)-Ord(S2^); //!! Must be replaced by ansi characters !!
    Inc(S1);
    Inc(S2);
  end;
  if (Result=0) and (S1^<>S2^) then // loop ended because exactly one has #0
    if S1^=#0 then // shorter string is smaller
      result:=-1
    else
      result:=1;
end;

fpc-2.6.2/rtl/objpas/sysutils/sysint.inc
Код: Выделить всё
{$ifndef FPC_NOGENERICANSIROUTINES}
    if not assigned(widestringmanager.StrCompAnsiStringProc) then
      widestringmanager.StrCompAnsiStringProc:=@GenericAnsiStrComp;


Добавлено спустя 3 минуты 23 секунды:
Так что нужно в первую очередь выяснять, а кто именно бросает исключение, какая из реализаций?
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Сравнение PChar

Сообщение debi12345 » 23.04.2013 15:13:01

Один фиг если строки однобайтные, то вайдменеджер - только для посчета ссылок.
И даже выневая "CompareString" вызывается не юникодной версии :evil: А юникодная CompareStringW умеет сравнивать только до 128 символов. Короче - тема нифига не допилена по части юникодности.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Сравнение PChar

Сообщение SeZuka » 23.04.2013 15:37:22

Еще в начале написал, смотрите какая системная функция вызывается в линухе для сравнения, причина в ней. Сам бы посмотрел, но нет под рукой линуха с лазарем.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Сравнение PChar

Сообщение Stertor » 11.12.2014 23:58:54

Это не баг. Нельзя работать с указателями на строки, как со строками. Только хардкор - lstrcmp
Аватара пользователя
Stertor
новенький
 
Сообщения: 20
Зарегистрирован: 10.08.2014 18:11:12

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 2

Рейтинг@Mail.ru