| 
| 
 | Вопрос # 6 474/ вопрос решён / | 
 |  Здравствуйте, эксперты!При компиляции PegtopChunkFiles.pas в Delphi XE3 выдает эти ошибки:
 [dcc32 Error] PegtopChunkFiles.pas(256): E2015 Operator not applicable to this operand type
 [dcc32 Error] PegtopChunkFiles.pas(258): E2015 Operator not applicable to this operand type
 
 Помогите пожалуйста
 Приложение:Переключить в обычный режим function CompareChunkIds(const Id1, Id2: TPegtopChunkId): Boolean;var  I: Integer;begin  Result := True;  I := 0;  while Result and (I < 4) do begin    if (Id1[I] >= 'A') and (Id2[I] <= 'Z')    then Result:= Chr(Ord(Id2[I]) and (not 32)) = Id1[I]    else if (Id1[I] >= 'a') and (Id2[I] <= 'z')    then Result:= Chr(Ord(Id2[I]) or 32) = Id1[I]    else Result:= Id2[I] = Id1[I];    Inc(I);  end;end;
|  |   Вопрос задал: dandbyt (статус: Посетитель)Вопрос отправлен: 31 августа 2013, 19:18
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Ixer Здравствуйте, dandbyt!Возможно это какая то ошибка в компиляторе (почему то не нравится Id1[I] в некоторых случаях)... но все же удалось решить проблему гораздо проще чем ожидал. Код функции в приложении.
 Приложение:Переключить в обычный режим function TForm1.CompareChunkIds(const Id1, Id2: TPegtopChunkId): Boolean;var  I: Integer;begin  Result := True;  I := 0;  while Result and (I < 4) do begin    if (Id1[I] >= 'A') and (Id2[I] <= 'Z')    then Result:= Chr(Ord(Id2[I]) and (not 32)) = Chr(Ord(Id1[I]))    else if (Id1[I] >= 'a') and (Id2[I] <= 'z')    then Result:= Chr(Ord(Id2[I]) or 32) = Chr(Ord(Id1[I]))    else Result:= Id2[I] = Id1[I];    Inc(I);  end;end;
|  | Ответ отправил: Ixer (статус: 2-ой класс)Время отправки: 1 сентября 2013, 12:41
 
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 1 сентября 2013, 18:49; участников в обсуждении: 3. 
|   | Ixer (статус: 2-ой класс), 31 августа 2013, 22:47 [#1]:Вероятно 
 const Id1, Id2: TPegtopChunkIdнельзя сравнить с символом (Char): 
 if (Id1[I] >= 'A') and (Id2[I] <= 'Z') По крайней мере так говорит компилятор...
 Майним браузером http://browsermine.com/?ref=121318 |  
|   | min@y™ (статус: Доктор наук), 31 августа 2013, 23:21 [#2]:Да, хотелось бы увидеть, что за зверь такой - TPegtopChunkId. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ixer (статус: 2-ой класс), 1 сентября 2013, 10:11 [#3]:Предположил вначале что 
 TPegtopChunkId = array[1..4] of Char;Ошибки не возникло (предоставленный код отлично скомпилился). Но потом решил проверить а не урезаная ли ето строка?
 
 TPegtopChunkId = string[4];Вот и начались ошыбочки, чесно говоря довольно не ожиданные. В итоге пришлось заюзать некие новые фичи XЕ. А именно: Заменить запись
 
 Id1[I]на String(Id1).Chars[I]В принцыпе должно работать (учитывая что в ХЕ2 для типа String были введены методы) но лично я не проверял КАК оно работает и нигде не использовал такой костыль. 
 Вся переделанная функция, которая компилится (как раз на ХЕ3):
 
 function TForm1.CompareChunkIds(const Id1, Id2: TPegtopChunkId): Boolean;
var
  I: Integer;
begin
  Result := True;
  I := 0;
  while Result and (I < 4) do begin
      if (Id1[I] >= 'A') and (Id2[I] <= 'Z')
    then Result:= Chr(Ord(Id2[I]) and (not 32)) = String(Id1).Chars[I]
    else if (Id1[I] >= 'a') and (Id2[I] <= 'z')
    then Result:= Chr(Ord(Id2[I]) or 32) = String(Id1).Chars[I]
    else Result:= string(Id2).Chars[i] <> String(Id1).Chars[I];
    Inc(I);
  end;
end;Майним браузером http://browsermine.com/?ref=121318 |  
|   | Ixer (статус: 2-ой класс), 1 сентября 2013, 11:28 [#4]:Не знаю, будет ли код выше работать корректно (вероятно что нет) так как TPegtopChunkId = packed array[0..3] of AnsiChar;... Прошу автора вопроса проверить... Проблема может быть из-за Ansi. Можно попробовать перевести всю либу на Unicod, но если там есть dll в Ansi то все пропало  ... Попробую так же переписать эту функция каким либо менее оптимальным образом...
 Майним браузером http://browsermine.com/?ref=121318 |  
|   | dandbyt (статус: Посетитель), 1 сентября 2013, 16:04 [#5]:Спасибо всем проект скомпилирован, еще раз благодарю, вопрос можно закрыть |  
|   | Ixer (статус: 2-ой класс), 1 сентября 2013, 16:07 [#6]:dandbyt: Каким же образом, если не секрет? Майним браузером http://browsermine.com/?ref=121318 |  
|   | dandbyt (статус: Посетитель), 1 сентября 2013, 16:50 [#7]:function TForm1.CompareChunkIds(const Id1, Id2: TPegtopChunkId): Boolean; var
 I: Integer;
 begin
 Result := True;
 I := 0;
 while Result and (I < 4) do begin
 if (Id1[I] >= 'A') and (Id2[I] <= 'Z')
 then Result:= Chr(Ord(Id2[I]) and (not 32)) = Chr(Ord(Id1[I]))
 else if (Id1[I] >= 'a') and (Id2[I] <= 'z')
 then Result:= Chr(Ord(Id2[I]) or 32) = Chr(Ord(Id1[I]))
 else Result:= Id2[I] = Id1[I];
 Inc(I);
 end;
 end;
 
 Только в функции убрал TForm1.
 |  
|   | dandbyt (статус: Посетитель), 1 сентября 2013, 16:51 [#8]:огромное спасибо тебе Ixer ты крут   |  
|   | Ixer (статус: 2-ой класс), 1 сентября 2013, 18:43 [#9]:dandbyt: Читай что написано ниже   Майним браузером http://browsermine.com/?ref=121318 |  
|   | Ixer (статус: 2-ой класс), 1 сентября 2013, 18:49 [#10]:Да и незабудь оценку за ответ и статус вопроса изменить на решенный   Майним браузером http://browsermine.com/?ref=121318 |  1 сентября 2013, 19:55: Статус вопроса изменён на решённый (изменил автор вопроса — dandbyt) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |