Delphi 5: boolean то же самое, что shortint ?
От: Arioch2  
Дата: 10.04.06 20:22
Оценка:
Забавный глюк компилятора.

[pascal]
function TSomeObj.BoolFun (var Data: TSomeRecord): boolean;
begin // реальный текст после добавлю
end;

(*** skip ***)

Const CycleOkFail: array[boolean]of string = ('Ошибка обмена.','Успешный
обмен.');

(*** skip ***)

SomeString := CycleOkFail[ BoolFun(SomeData)];
[pascal]


Вспоминаем что в паскале false — 0, а к true приводится то, что не ноль.
Также вспоминаем, что Ord(true) = 1;

Пытаемся угадать, как же будет выглядеть вызов функции и получение адреса
в массиве.
Открываем Debug/CPU Windows и... удивляемся.

  ;  ...skip
  call  TSomeObj.BoolFun
  and eax, $7f
  mov edx, [eax*4 + CycleOkFail]
  ;  ...skip


Интересно, кто мог такой шаблон запрограммировать ?
--
Написано в Opera:
http://www.myopera.net/students/30_days/comoperalover711ru.html
Posted via RSDN NNTP Server 2.1 beta
Re: Delphi 5: boolean то же самое, что shortint ?
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 11.04.06 01:11
Оценка:
Hello Arioch2, you wrote:

> Забавный глюк компилятора.


А в чем и где глюк?

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[2]: Delphi 5: boolean то же самое, что shortint ?
От: ekamaloff Великобритания  
Дата: 11.04.06 08:50
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>А в чем и где глюк?


А то, что вот это, например, падает без объяснения причин:

program Test;

{$APPTYPE CONSOLE}

uses SysUtils;

function BoolFun: Boolean;
begin
    Result := Boolean(2);
end;

const
    CycleOkFail: array[Boolean] of string = ('Ошибка обмена.',
        'Успешный обмен.');
var
    SomeString: string;
begin
    SomeString := CycleOkFail[BoolFun];
    Writeln(SomeString);
    ReadLn;
end.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: Delphi 5: boolean то же самое, что shortint ?
От: Danchik Украина  
Дата: 11.04.06 10:11
Оценка:
Здравствуйте, Arioch2, Вы писали:

[Skip]

Знакомые грабли, действительно Delphi интерпретирует Boolean как Byte
0    - False
<> 0 - True

И никада об этом не забывать
Ну и как уже показал ekamaloff:
Boolean(2) <> (2 = 2)
Re[3]: Delphi 5: boolean то же самое, что shortint ?
От: Аноним  
Дата: 11.04.06 15:38
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>function BoolFun: Boolean;

E>begin
E> Result := Boolean(2);
E>end;


А Вам разве кто-то обещал, что boolean = {byte, word, dword, integer... продолжить по необходимости}
Формируйте из этой двойки булевое выражение — и будет счастье. Иначе получаем код, привязанный к особеностям реализации конкретной версии конкретного компилятора.
Re[3]: Delphi 5: boolean то же самое, что shortint ?
От: Аноним  
Дата: 11.04.06 15:44
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>function BoolFun: Boolean;

E>begin
E> Result := Boolean(2);
E>end;


А Вам разве кто-то обещал, что boolean = {byte, word, dword, integer... продолжить по необходимости}
Формируйте из этой двойки булевое выражение — и будет счастье. Иначе получаем код, привязанный к особеностям реализации конкретной версии конкретного компилятора.
Re[2]: Delphi 5: boolean то же самое, что shortint ?
От: Arioch  
Дата: 11.04.06 21:25
Оценка:
The stars so gaily glistened... (Tue, 11 Apr 2006 10:11:49 GMT @466)
...while the fading voice of Danchik whispered through the darkness:

D> Знакомые грабли, действительно Delphi интерпретирует Boolean как Byte


Не, как ShortIntю Иначе маска была бы $FF, а не $7F

D>
 D> 0    - False
 D> <> 0 - True
 D>

D> И никада об этом не забывать

Я-то помню, Delphi забывает.
Интересно, как с этим в Kylix / FreePascal / Virtual Pascal ?
--
WinAMP://none: WinAMP is suffocated
http://Arioch.nm.ru/FL/Fidolook_SL.png
Mail: the)under(Arioch)at(nm)dot(ru ICQ: xmpp:arioch@jabber.ru
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Delphi 5: boolean то же самое, что shortint ?
От: Arioch  
Дата: 11.04.06 21:25
Оценка:
The stars so gaily glistened... (Tue, 11 Apr 2006 15:38:35 GMT @693)
...while the fading voice of Аноним whispered through the darkness:

А> Здравствуйте, ekamaloff, Вы писали:


E>> function BoolFun: Boolean;

E>> begin
E>> Result := Boolean(2);
E>> end;

Еще смешнее — падает простое без всяких хакерских (елси приведение типов —
это хакерство) штучек

 function BoolFun: Boolean;
 begin
 end;


А> А Вам разве кто-то обещал, что boolean = {byte, word, dword, integer...

А> продолжить по необходимости}

Нам как раз обещали, что boolean — это не shortint и не другие типы.

А> получаем код, привязанный к особеностям реализации конкретной версии

А> конкретного компилятора.

Простите, пример в моем первом посте — где там привязка к конкретному
компилятору???
Вы о чём ?
--
WinAMP://none: WinAMP is suffocated
http://Arioch.nm.ru/FL/Fidolook_SL.png
Mail: the)under(Arioch)at(nm)dot(ru ICQ: xmpp:arioch@jabber.ru
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Delphi 5: boolean то же самое, что shortint ?
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 12.04.06 12:59
Оценка: :)
Hello Arioch, you wrote:

Оберните в try/except — и не будет падать

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[6]: Delphi 5: boolean то же самое, что shortint ?
От: ekamaloff Великобритания  
Дата: 12.04.06 13:32
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Hello Arioch, you wrote:


SA>Оберните в try/except — и не будет падать


Я подумываю вообще все программы полностью оборачивать в try-except и не париться. Вот ведь ляпота будет! Баги просто уползут поджав хвосты.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[7]: Delphi 5: boolean то же самое, что shortint ?
От: Danchik Украина  
Дата: 12.04.06 14:49
Оценка:
Здравствуйте, ekamaloff, Вы писали:

[Skip]

E>Я подумываю вообще все программы полностью оборачивать в try-except и не париться. Вот ведь ляпота будет! Баги просто уползут поджав хвосты.


Ех... (так мечтательно, тем временем вытирая очередной try excep end, плюхнутый чайником)
Re[7]: Delphi 5: boolean то же самое, что shortint ?
От: Аноним  
Дата: 18.04.06 10:39
Оценка:
E>Я подумываю вообще все программы полностью оборачивать в try-except и не париться. Вот ведь ляпота будет! Баги просто уползут поджав хвосты.
Заметать мусор под ковер — это дурной тон. Баги станут менее заметными, но не исчезнут. Потом комп. будет виснуть без всяких видимых причин. Объясняй потом юзерям, что это не ошибка а особенность реализации и дизайнерской мысли .