![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Все привет. Читаю книгу "Дельфи. Полное руководство" Сухарев М.
И вот вопрос возник в книге описаны интервальные типы данных. В краце это подмножество с начальным и конечными значениями. Используется для ограничения вводимого диапазона данных. и распростроняется на Integer и Char переменные. Но вот казус небольшой. Код:
type TInt = 0..15; var r: TInt; ... procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin for i:=0 to 20 do try r:=i; finally ListBox1.Items.Add(inttostr(r)); end; end; по сути своей код должен добавить в ЛистБокс значения от 0 до 15 т.к. 16 - 20 не входит в диапазон интервального типа. Но программа выполняется без ошибок и присваевает переменной r значения с 16 по 20, что вообще то не должно быть. Если же попытаться выполнить вот этот кусок кода Код:
type TInt = 0..15; var r: TInt; ... procedure TForm1.Button1Click(Sender: TObject); begin try r:=20; finally ListBox1.Items.Add(inttostr(r)); end; end; Программа соответственно отругается что переменной r присваемое значение не входит в диапазон... Вопрос: Интересно почему же в цикле переменная r принимает значение выходящие из диапазона? Последний раз редактировалось dmdx, 02.08.2008 в 16:47. |
#2
|
|||
|
|||
![]() можно попробывать выполнить вот такой вот код.
Код:
type T_Int = 0..15; var r: T_Int; ... procedure TForm1.Button1Click(Sender: TObject); begin try r:=application.handle; finally ListBox1.Items.Add(inttostr(application.handle)+' = '+inttostr(r)); end; end; Тоже выполняется. получается что контроль идет на уровне кода? Ваще че то логике не поддается не могу понять. |
#3
|
|||
|
|||
![]() Проделал то же самое с массиво из букавак такая же хрень. Получается эти интервальные типы нужны при контроле составление чтобы что нить не так руками вбить. А при выполнении проги они как бы не работают?!
|
#4
|
|||
|
|||
![]() В первом примере dmdx выражение r := i пропускается компилятором потому, что он понятия не имеет какое значение примет управляющая переменная "i" во время выполнения (на for не смотрите - там тип integer и никакого отношения "i" к "r" не имеет, кроме визуального, компилятор же об этом отношении не подозревает).
Т.к. интервальные значения заданы числами (0..15), то присвоение переменной этого типа переменной другого типа, но тоже числового (integer) компилятора не пугает. Во втором примере явное присвоение значения константы выходящее за пределы интервала компилятора ставит на дыбы. Похожая ситуация (как и в первом примере dmdx) в примере с Handle. Т.к. это переменная, то бедняге компилятору неизвестно какое значение этого Handle будет во время выполнения, потому и пропускает. Еще надо знать, что при объявлении типа TInt системой резервируется память вовсе не размером 1 байт, а все четыре. Оттого и во время выполнения ошибки может не быть, даже если Handle будет большим числом (чего как правило и бывает). Но такое присвоение на грани фола и чего будет на самом деле при выполнении одному господу известно. Такие вещи можно делать только в экспериментах. Не забывайте делать резервные копии Последний раз редактировалось san-46, 02.08.2008 в 21:41. |