Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Как определить чего ты стоишь как программист.   Найти похожие ветки 

 
Юрий Зотов ©   (2004-04-07 18:25) [240]

> Style ©   (07.04.04 18:21) [238]

Включите птичку "Range Checking" в опциях компилятора.


 
Style ©   (2004-04-07 18:29) [241]


> т.к. вы делаете явное преобразование типов.

не совсем понял что значит явное?
Если я напишу константу - число 6
то компилятор выдаст ошибку, а в RunTime TRange получается хранится как INTEGER т.е. размеры типа TRange там не играют никакого значения?


 
Тимохов ©   (2004-04-07 18:32) [242]


> Юрий Зотов ©   (07.04.04 18:25) [240]
> > Style ©   (07.04.04 18:21) [238]
>
> Включите птичку "Range Checking" в опциях компилятора.

Юрий, я конечно могу ошибаться, но и при range checking это также будет срабатывать...
....
проверил, именно так и есть - у меня не ругается.


 
Verg ©   (2004-04-07 18:34) [243]


> Piter ©   (07.04.04 17:38) [235]
> Verg (06.04.04 21:18) [163]
> Так откуда и почему эта привычка поинтеры приводить к integer-ам
> Integer - "Целое со знаком", со знаком, понимаете, со зна-ком!
>
> ну и что? Если $OVERFLOWCHECKS отключен (а так и есть по
> умолчанию и обычно не включают, ибо тормозит выполнение),
> то все будет нормально.


Начни с постановки вопроса

Verg ©   (06.04.04 20:41) [156]


 
Тимохов ©   (2004-04-07 18:36) [244]

У меня в общем такой код

var
R: TRange;
a: integer;
begin
a := 100;
r := TRange(a);
end;


работает при любых опциях компилятора.

а

var
R: TRange;
a: integer;
begin
a := 100;
r := a;
end;


не работает при range checking +


 
Style ©   (2004-04-07 18:37) [245]

Юрий Зотов ©  
Все понял...

Зато я могу сделать RangeCheck сам если
необходимо при помощи Low и High...

Просто думаю если не включена Overflow checking и я превышаю предел integer то число становится отрицательным, вот как бы сделать такое с TRange?


 
Юрий Зотов ©   (2004-04-07 18:42) [246]

Значит, все дело в прямом приведении типа. Увидев его, компилятор говорит "Ну, что ж, Вы сами этого хотели" - и не вставляет код проверки значения.


 
Игорь Шевченко ©   (2004-04-07 18:45) [247]

Тимохов ©   (07.04.04 18:36)

Такой код:

var
 A: TButton
 B: TStringList;
begin
 B := TStringList.Create;
 A := TButton(B);
end;


Тоже будет работать. До тех пор, пока к А не обратятся, как к TButton


 
Style ©   (2004-04-07 18:48) [248]

Юрий Зотов ©  
А я так понял что на самом деле "тип" TRange принемает значение
того основного числового типа в чьих пределах лежит его предел :) во загнул

Легко проверить

 TRange = 1..256;
var

 R: TRange;
begin
 a := -1;
 r := TRange(a);

r сейчас равно 65535
а если
TRange = 1..254;

то r = 255

:)))


 
Тимохов ©   (2004-04-07 18:49) [249]


> Игорь Шевченко ©   (07.04.04 18:45) [247]

а я спорю? :)))))
имхо, Юрий очень точно все сказал в пред. посте.


 
Тимохов ©   (2004-04-07 18:51) [250]


> Style ©   (07.04.04 18:48) [248]

тип trange существует лишь для того, чтобы сказать компилятору, что при нормальной работе с переменными этого типа (т.е. без явных преобразований) нужно вставлять range check (если таковый есть в опциях проекта).

во загнул...


 
Verg ©   (2004-04-07 18:54) [251]


> Тимохов ©   (07.04.04 18:51) [250]


Когда-то компиляторы Паскаля (по-крайней мере некоторые) не имели встроенного типа Word, только integer и byte
Там так и писали

type
 Word = (0..65535);


 
Style ©   (2004-04-07 18:54) [252]

Тимохов ©
Да я понял на счет range check
но мне просто хотелось что если бы я написал

TRange(100) то тот мне возвратил 5 :)


 
Тимохов ©   (2004-04-07 18:55) [253]


> Style ©   (07.04.04 18:54) [252]

на фиг такие типы.
имхо толку от них мало - потенциальное место для ошибки

имхо, конечно.

(прикрывая готову руками - вот сейчас ревнители дельфи налетят и порвут)


 
Юрий Зотов ©   (2004-04-07 19:04) [254]

> Style ©   (07.04.04 18:48) [248]

Размер пользовательского порядкового типа определяется исходя из его предельных значений и всегда по минимуму. А для реального представления берется ближайший стандартный тип.

TRange = 1..254; // Это 1 байт и фактически берется Byte.
TRange = 1..256; // Это 2 байта и фактически берется Word.

Вы загоняете в него FFFFFFFF. Лищнее отсекается и в первом случае получается FF (т.е. 255), а во втором FFFF (т.е. 65535). Поскольку используется прямое приведение, ошибок переполнения и выхода за диапазон не возникает.


 
Style ©   (2004-04-07 19:13) [255]

Юрий Зотов ©
Не я прекрасно понял что берется ближайший стандартный тип

Но думал что прямое преобразование ограничит число не в пределах стандартного типа, а в пределах TRange


> имхо толку от них мало - потенциальное место для ошибки


Не думаю что это место для ошибки в конце концов можно было бы поставить тот же range check.


 
Style ©   (2004-04-07 19:15) [256]

В общем для таких целей можно и функцию написать которая определяет по High и Low число которое будет лежать именно в диапазоне TRange а не за его пределами.


 
Тимохов ©   (2004-04-07 19:17) [257]


> Style ©   (07.04.04 19:15) [256]

ставьте, не ставьте range check - при явном преобразовании толку не будет.
этот тип имхо так - для красоты...


 
Юрий Зотов ©   (2004-04-07 19:19) [258]

> Style ©   (07.04.04 19:13) [255]

Чтобы понять все до конца, повторите то же самое, что Вы делали в [248], но только возмите A типа Cardinal и равное $ABCD. А при анализе результатов смотрите R в виде HEX и вспомните тот самый вопрос 1.1.
:о)


 
Юрий Зотов ©   (2004-04-07 19:21) [259]

> Тимохов ©   (07.04.04 19:17) [257]

> этот тип имхо так - для красоты...

Не для красоты, а для отладки. А иногда и не только для отладки. Очень удобная паскалевская фича.


 
Тимохов ©   (2004-04-07 19:23) [260]


> Юрий Зотов ©   (07.04.04 19:21) [259]

наверное,
но у меня как-то с ним любовь не сложилась.


 
Fantasist ©   (2004-04-07 19:34) [261]


> с ходу:
> 1. через newinstance
> 2. через конструктор в возбуждением исключения
> 3. через классовый метод класса с вызовом private конструктора.
>
> ясно, что самый "прямой" это 1.


 Лично для меня, самый прямой был бы 3, именно его я и привел (с помарками, правда). Но Делфи, в этом деле порядочная сволочь - конструктор объявлен public в TObject, поэтому, как минимум, он всегда доступен.  Вариант 2, конечно, не практический, остается только 1, хотя мне в нем как раз и не нравиться, что клиенту не очевидна особенность данного класса. В коде это будет выглядеть как создание нового экземпляра. Решение 3 было бы вернее, но в Делфи не применимо.


 
Юрий Зотов ©   (2004-04-07 19:34) [262]

> Тимохов ©   (07.04.04 19:23) [260]

Из чего я делаю вывод, что Вы больше приверженец Асма и Си, чем Паскаля. Большинство из них так и считают - лишнее, мол. А ведь это действительно очень удобно - полнота и качество отладки и тестирования заметно возрастают, причем без малейших усилий с нашей стороны.

Еще раз приведу пример из своей реальной практики (язык PL/1, который запросто конвертировал что угодно во что угодно).

DCL // Это Паскалевское var
 I DEC FIXED(1); // То есть, одна десятичная цифра

DO I=0,9 // Это Паскалевское for I := 0 to 9 do
... // тело цикла

И получился бесконечный цикл. Ошибку я искал три дня. Каково?
А на Паскале я выловил бы ее мгновенно и без малейшего напряга.


 
Тимохов ©   (2004-04-07 19:41) [263]


> Fantasist ©   (07.04.04 19:34) [261]

Ну хоть кто-то поддержал, что это тоже вариант :)))))
Ну Public. В чем проблема - делаете конструтор create в нем сразу raise .... Делаете другой конструктор private constructor Internalcreate. И все.
Метод, конечно дурацкий, но все же рабочий.


> Юрий Зотов ©   (07.04.04 19:34) [262]

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


 
Fantasist ©   (2004-04-07 19:47) [264]


> Ну хоть кто-то поддержал, что это тоже вариант :)))))


 Скоро традицией у меня станет вас поддерживать. :)


> Ну Public. В чем проблема - делаете конструтор create в
> нем сразу raise ....


 Это тогда вариант 2, который еще хуже, чем 1.


 
Тимохов ©   (2004-04-07 19:51) [265]


> Fantasist ©   (07.04.04 19:47) [264]

имхо не хуже, а не красивее.

вариант 1 - лучший.

>>>>>>Юрий Зотов

Скажите, все-таки, что вы ожидали услышать в ответе на этот вопрос (про создание одного экз. класса)? Вернее, какой ответ для вас был бы сигналом, что человек заслуживает внимания?


 
Gamlet ©   (2004-04-07 21:03) [266]

Удалено модератором


 
Cobalt ©   (2004-04-07 21:27) [267]

Вопрос к Юре Зотову - что Вы скажете насчёт моего объяснения про OnCreate (http://delphimaster.net/view/14-1081172092/  ответ №187)

" - Я пг"ав или не пг"ав???"


 
Style ©   (2004-04-07 21:27) [268]


> Юрий Зотов ©   (07.04.04 19:19) [258]
> > Style ©   (07.04.04 19:13) [255]
>
> Чтобы понять все до конца, повторите то же самое, что Вы
> делали в [248], но только возмите A типа Cardinal и равное
> $ABCD. А при анализе результатов смотрите R в виде HEX и
> вспомните тот самый вопрос 1.1.
> :о)


type
TRange = 1..256;
var
a: cardinal;
R: TRange;
begin
a := $ABCD;
r := a;
Caption := IntToHex(r,2);

Ну у меня r все равно ABCD??? В чем подвох??

Вы наверное хотели сказать о том что в памяти ABCD выглядит как CDAB??


 
Cobalt ©   (2004-04-07 21:36) [269]

А как же второй вариант?
Который с 1..254.


 
Piter ©   (2004-04-07 21:38) [270]

pasha_golub (07.04.04 16:48) [228]
но я то спрашивал про связку из трех строчек, а не про вырванную из контекста одну.


ну если ты понимаешь каждую из строчек, то почему ты не можешь сказать результат? Просто можно сделать несколько заданий. Типа чему равен High(Integer), потом задать вопрос на приведение типов. Потом задать вопрос по адресации. А Зотов взял и объединил все в двух строчках. Почему нет?
На самом деле, если человек ответил, то, наверное, он не будет задавать вопросов, если в коде встретит выражение
if (a) xor (b)

А я вот что хотел спросить:
Почему в TObject.NewInstance используется некий  _GetMem, что это такое?


 
Style ©   (2004-04-07 21:51) [271]

Ну второй вариант CD
потому что

r приравнивается к byte
и поскольку в памяти все выглядит как CDAB то и берется первый байт.

r = CD

это тоже самое что

I: integer;

i := $ABCD;
i := byte(i);


 
Игорь Шевченко ©   (2004-04-07 21:53) [272]


> А я вот что хотел спросить:
> Почему в TObject.NewInstance используется некий  _GetMem,
> что это такое?


А это выделение памяти под экземпляр объекта


 
Piter ©   (2004-04-07 22:01) [273]

Тимохов (07.04.04 17:46) [236]
будет работать и при включенном overflowchecks...


а это ты вообще к чему?
А если так, допустим, в I типа Integer хранится значение $7FFFFFFF

Ptr:=Pointer(I+1);

Будет работать? А вот если I это LongWord, то будет Это при включенной директиве. При выключенной я уже говорил, что разницы нет, зря Verg возмущается...

Verg (07.04.04 18:34) [243]
Начни с постановки вопроса


а это здесь причем. Я говорил про твою фразу, что нельзя Integer(@...) использовать...


 
Verg ©   (2004-04-07 22:07) [274]

Piter ©   (07.04.04 22:01) [273]

А я спрашивал как сравнить два A, и B : pointer;

A > B

Я не про САМ ФАКТ преобразования pointer к integer как такового, а про корректность полученного результата...

Ты сможешь сделать полнофункциональной ту ф-цию? Хоть с rangecheck, хот без оного?


 
Piter ©   (2004-04-07 22:11) [275]

Игорь Шевченко (07.04.04 21:53) [272]
А это выделение памяти под экземпляр объекта


Я так и знал... :)))
Но почему не GetMem?


 
Piter ©   (2004-04-07 22:25) [276]

Verg (07.04.04 22:07) [274]
А я спрашивал как сравнить два A, и B : pointer


сравнивать два Pointer"а ? А зачем? Ну если надо

LongWord(A) > LongWord(B)

если я тебя правильно понял...


 
Verg ©   (2004-04-07 22:37) [277]


> LongWord(A) > LongWord(B)


Нет, Piter, - ты хитрэц, "Уж", так сказать :))

То ты про Integer(pointer), тот ты про LongWord(pointer).

Нет уж ты уж скажи сначала - корректно ли, все же, преобразовывать pointer к integer, хотя как ты сам сказал, pointer - это вообще не....?
Что там? (Это насчет high(pointer))


> сравнивать два Pointer"а ? А зачем? Ну если надо


Я тоже не спрошу зачем прибавлять к поинтеру некоторе число (почему-то два, а не sizeof(I) div 2), приводя тот самый поинтер предварительно к integer-у, как в тесте. Почему-то не к cardinal и не к pchar.


 
Игорь Шевченко ©   (2004-04-07 22:45) [278]

Piter ©   (07.04.04 22:11)

> Но почему не GetMem?


Потому что это одно и тоже :)


 
Piter ©   (2004-04-08 00:44) [279]

Verg (07.04.04 22:37) [277]
корректно ли, все же, преобразовывать pointer к integer


абсолютно корректно. Сложение как Integer"а тоже корректно (именно это было в задании ЮЗ, почему я и сказал), если нет директивы упомянутой. Если она есть - то может возникнуть исключение при "перепрыгивании" из положительного диапазона в отрицательный (что не так и вероятно).

Verg (07.04.04 22:37) [277]
Я тоже не спрошу зачем прибавлять к поинтеру некоторе число


например, чтобы узнать адрес нужного смещения. Допустим, ты хочешь узнать количество ссылок в структуре AnsiString - как ты это реализуешь, интересно? Если не операциями с адресами...

Игорь Шевченко (07.04.04 22:45) [278]
Потому что это одно и тоже :)


ну а почему все таки не просто GetMem? Ничего не бывает просто так...


 
Verg ©   (2004-04-08 06:27) [280]


> Piter ©   (08.04.04 00:44) [279]
> Verg (07.04.04 22:37) [277]
> корректно ли, все же, преобразовывать pointer к integer
>
> абсолютно корректно.


Но, тем не менее, сам почему-то написал longword(A), а не integer в  [276].....

Думаем одно, а говорим другое?



Страницы: 1 2 3 4 5 6 7 8 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.11 MB
Время: 0.57 c
3-1081410101
gedd
2004-04-08 11:41
2004.05.02
Получить сумму по столбцу в ehlib?


1-1081927279
han
2004-04-14 11:21
2004.05.02
работа с указателями


1-1081924204
Переяслов Григорий
2004-04-14 10:30
2004.05.02
Функция, возвращающая размер файла


4-1078450068
sucer
2004-03-05 04:27
2004.05.02
Как корректно уничтожить поток(Thread)?


1-1081790285
К.С.
2004-04-12 21:18
2004.05.02
Прозрачность части timage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский