X1 in [0..X2] =???

Вопросы программирования и использования среды Lazarus.

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

X1 in [0..X2] =???

Сообщение VirtUX » 16.10.2008 17:09:16

Вот пример:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  iFor, iFor2, xI: integer;
begin
  ListBox1.Hide;
  ListBox1.Clear;
  for iFor := 0 to 10000 do
    for iFor2 := 0 to iFor do
      begin
        if iFor2 > 100 then break;
        if not(iFor2 in [0..iFor]) then
          ListBox1.Items.Add('Top=' + IntToStr(iFor) + '; In=' + IntToStr(iFor2));
      end;
  ListBox1.Show;
end;

initialization
  {$I unit1.lrs}

end.

Начиная с 256 (верхняя граница вхождения) функция в нерабочем состоянии.
Баг или как?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: X1 in [0..X2] =???

Сообщение v-t-l » 16.10.2008 17:19:41

VirtUX писал(а):
Код: Выделить всё
if not(iFor2 in [0..iFor]) then

ограничение компилятора для in.
А почему не
Код: Выделить всё
if iFor2 > iFor then
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: X1 in [0..X2] =???

Сообщение Timid » 16.10.2008 21:07:21

Никакое это не ограничение с in.

Просто множество представляется компилятором как восьмибайтовое целое. Каждое вхождение - очередной бит. При выполнении in делается простой And с шаблоном. Вот почему больше 256 элементов в множестве быть не может.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: X1 in [0..X2] =???

Сообщение v-t-l » 17.10.2008 10:25:12

Timid писал(а):Никакое это не ограничение с in.

in работает со множествами. Ограничение для множеств [0..255]. => Компилятор ограничивает in в диапазоне [0..255].
Хотя, технически, можно было бы и dword и qword использовать. :)
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: X1 in [0..X2] =???

Сообщение Timid » 17.10.2008 12:07:35

По русски что-ли не понятно написал?
Никакого отношения к размерности целых чисел множества не имеют. Ограничение в 256 элементов связано только с реализацией "алгебры" для множеств.
Она реализуется на основе битовой алгебры и восьмибайтовых регистров. Всего 256 бит.

На фазе препроцессинга компилятор отбирает все возможные "наименования" элементов множества и заносит в таблицу "имя"х"код". Каждый код таблицы образуется как восьмибайтовое число с одним установленным битом. Все коды в этой таблице уникальны.

Если значение (слева от in) не входит в таблицу, то оно и не проверяется на совпадение.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: X1 in [0..X2] =???

Сообщение v-t-l » 17.10.2008 15:15:05

Теперь понятно, как работает in. Проглядел "восьмибайтовое целое".
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron