Ещё один нежданчик с автоматической перекодировкой

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

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

Ещё один нежданчик с автоматической перекодировкой

Сообщение Cheb » 28.01.2018 13:38:32

Запустил программу, собранную фпцём 3.0.4 на супер, эпически, былинно древнем говне мамонта:

Код: Выделить всё
Operating System: Wine 1.3.28 / Ubuntu 11.10
User name: cheb
CPU Phenom II X2 550
  x2 logical cores
  level 2 cache: 512 Kbytes, line size 64 bytes
  TSC invariancy: yes
  TSC frequency: 3.11 GHz)


где она !внезапно упала, с Failed to load "GL_ARB_framebuffer_object"
Почесал межушную кость, стал копать.
Откопал кусок кода, наивно полагающий String = AnsiString
Код: Выделить всё
function glext_ExtensionSupported(const extension: String; const searchIn: String): Boolean;
var
  extensions: PAnsiChar;
  start: PAnsiChar;
  where, terminator: PAnsiChar;
begin

  if (Pos(' ', extension) <> 0) or (extension = '') then
  begin
    Result := FALSE;
    Exit;
  end;

  if searchIn = '' then extensions := PAnsiChar(glGetString(GL_EXTENSIONS))
  else extensions := PAnsiChar(searchIn);
  start := extensions;
  while TRUE do
  begin
    where := StrPos(start, PAnsiChar(extension));
    if where = nil then Break;
    terminator := Pointer(PtrUInt(where) + Length(extension));
    if (where = start) or (PAnsiChar(PtrUInt(where) - 1)^ = ' ') then
    begin
      if (terminator^ = ' ') or (terminator^ = #0) then
      begin
        Result := TRUE;
        Exit;
      end;
    end;
    start := terminator;
  end;
  Result := FALSE;
end;

Исправил на AnsiString - сразу всё обнаружилось, взлетело, и рендером доказало, что на GeForce 7025 тоже есть жизнь.

Но, что самое смешное, в реальной винде неправильный вариант работал без ошибок!
А в древнем вайне эта ваша авто-перекодировка !внезапно йокнулась.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 684
Зарегистрирован: 06.06.2005 15:54:34

Re: Ещё один нежданчик с автоматической перекодировкой

Сообщение Azazaz » 28.01.2018 21:38:41

{$H+} делает все String AnsiString.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Ещё один нежданчик с автоматической перекодировкой

Сообщение Cheb » 29.01.2018 10:36:43

Cheb
Сообщения: 607
Зарегистрирован: 06.06.2005
Azazaz
Сообщения: 41
Зарегистрирован: 21.04.2015

Яйца курицу не учат.

На случай, если кто ещё попадётся такой же, кхм, догадливый: речь в моём посте шла про новый режим {$modeswitch unicodestrings} когда String = UnicodeString и при присваивании его AnsiString и обратно происходят неявные преобразования кодировок, чреватые былинными глюками в старом коде.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 684
Зарегистрирован: 06.06.2005 15:54:34

Re: Ещё один нежданчик с автоматической перекодировкой

Сообщение fedan » 01.02.2018 23:48:46

В glext.pp fpc-3.0.5 ревизия 38034:
Код: Выделить всё
function glext_ExtensionSupported(const extension: String; const searchIn: String): Boolean;
var
  extensions: PChar;
  start: PChar;
  where, terminator: PChar;
begin

  if (Pos(' ', extension) <> 0) or (extension = '') then
  begin
    Result := FALSE;
    Exit;
  end;

  if searchIn = '' then extensions := PChar(glGetString(GL_EXTENSIONS))
  else extensions := PChar(searchIn);
  start := extensions;
  while TRUE do
  begin
    where := StrPos(start, PChar(extension));
    if where = nil then Break;
    terminator := Pointer(PtrUInt(where) + Length(extension));
    if (where = start) or (PChar(PtrUInt(where) - 1)^ = ' ') then
    begin
      if (terminator^ = ' ') or (terminator^ = #0) then
      begin
        Result := TRUE;
        Exit;
      end;
    end;
    start := terminator;
  end;
  Result := FALSE;

end;

Может стоит багу зарепортить?
Но я не юзал glext, особенно в wine.
fedan
новенький
 
Сообщения: 48
Зарегистрирован: 15.09.2016 21:18:48

Re: Ещё один нежданчик с автоматической перекодировкой

Сообщение Cheb » 02.02.2018 01:39:26

Именно оттуда я это и выдрал!
Но надо проверить, как откомпилирован тот юнит RTL - возможно, без юникодности, и всё Ок?
Дело в том, что я его раздёргал на инклюды, которые вштырил в юнит, в котором определено
Код: Выделить всё
{$if FPC_FULLVERSION>=20700}
  {$modeswitch unicodestrings}
{$endif}
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 684
Зарегистрирован: 06.06.2005 15:54:34


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

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

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

Рейтинг@Mail.ru