Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

Помогите пожалуйста

Приложение:
  1. function CompareChunkIds(const Id1, Id2: TPegtopChunkId): Boolean;
  2. var
  3. I: Integer;
  4. begin
  5. Result := True;
  6. I := 0;
  7. while Result and (I < 4) do begin
  8. if (Id1[I] >= 'A') and (Id2[I] <= 'Z')
  9. then Result:= Chr(Ord(Id2[I]) and (not 32)) = Id1[I]
  10. else if (Id1[I] >= 'a') and (Id2[I] <= 'z')
  11. then Result:= Chr(Ord(Id2[I]) or 32) = Id1[I]
  12. else Result:= Id2[I] = Id1[I];
  13. Inc(I);
  14. end;
  15. end;


dandbyt Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: dandbyt (статус: Посетитель)
Вопрос отправлен: 31 августа 2013, 19:18
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Ixer

Здравствуйте, dandbyt!
Возможно это какая то ошибка в компиляторе (почему то не нравится Id1[I] в некоторых случаях)... но все же удалось решить проблему гораздо проще чем ожидал. Код функции в приложении.

Приложение:
  1. function TForm1.CompareChunkIds(const Id1, Id2: TPegtopChunkId): Boolean;
  2. var
  3. I: Integer;
  4. begin
  5. Result := True;
  6. I := 0;
  7. while Result and (I < 4) do begin
  8. if (Id1[I] >= 'A') and (Id2[I] <= 'Z')
  9. then Result:= Chr(Ord(Id2[I]) and (not 32)) = Chr(Ord(Id1[I]))
  10. else if (Id1[I] >= 'a') and (Id2[I] <= 'z')
  11. then Result:= Chr(Ord(Id2[I]) or 32) = Chr(Ord(Id1[I]))
  12. else Result:= Id2[I] = Id1[I];
  13. Inc(I);
  14. end;
  15. end;


Ответ отправил: Ixer (статус: 2-ой класс)
Время отправки: 1 сентября 2013, 12:41


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 1 сентября 2013, 18:49; участников в обсуждении: 3.
Ixer

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™

min@y™ (статус: Доктор наук), 31 августа 2013, 23:21 [#2]:

Да, хотелось бы увидеть, что за зверь такой - TPegtopChunkId.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

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

Ixer (статус: 2-ой класс), 1 сентября 2013, 11:28 [#4]:

Не знаю, будет ли код выше работать корректно (вероятно что нет) так как
TPegtopChunkId = packed array[0..3] of AnsiChar;
... Прошу автора вопроса проверить... Проблема может быть из-за Ansi. Можно попробовать перевести всю либу на Unicod, но если там есть dll в Ansi то все пропало :-( ...
Попробую так же переписать эту функция каким либо менее оптимальным образом...
Майним браузером http://browsermine.com/?ref=121318
dandbyt

dandbyt (статус: Посетитель), 1 сентября 2013, 16:04 [#5]:

Спасибо всем проект скомпилирован, еще раз благодарю, вопрос можно закрыть
Ixer

Ixer (статус: 2-ой класс), 1 сентября 2013, 16:07 [#6]:

dandbyt: Каким же образом, если не секрет?
Майним браузером http://browsermine.com/?ref=121318
dandbyt

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

dandbyt (статус: Посетитель), 1 сентября 2013, 16:51 [#8]:

огромное спасибо тебе Ixer ты крут 8-)
Ixer

Ixer (статус: 2-ой класс), 1 сентября 2013, 18:43 [#9]:

dandbyt: Читай что написано ниже 8-)
Майним браузером http://browsermine.com/?ref=121318
Ixer

Ixer (статус: 2-ой класс), 1 сентября 2013, 18:49 [#10]:

Да и незабудь оценку за ответ и статус вопроса изменить на решенный :-D
Майним браузером http://browsermine.com/?ref=121318

1 сентября 2013, 19:55: Статус вопроса изменён на решённый (изменил автор вопроса — dandbyt)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.03 сек.