|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|