Форум: "Потрепаться";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизОператор IS небезопасен для форм Найти похожие ветки
← →
DiamondShark © (2004-07-14 16:53) [120]
> Piter © (14.07.04 16:30) [105]
> DiamondShark © (14.07.04 14:09) [75]
> А теперь внимание, вопрос. Каким образом определить, сослался
> ли указатель на структуру RTTI, просто на какой-то кусок
> памяти, или вообще за пределы адресного пространства?
> Ответ: никаким.
>
> А вот это хороший вопрос. И ответ, имхо, неправильный.
>
> Нужно просто вызвать IsClass :)
> Если он вернет True - значит, это как раз структура RTTI.
> Если он вызывал AV - то значит нет.
>
> Возможны, конечно, случаи, что в памяти будут случайные
> наборы байтов, которые в сумме образуют нужный код, который
> вернет true.... но это грубо говоря маловероятно :)
Не надо грубо говорить, обычно от этого фигня получается.
Ты предлагаешь реализовать оператор в расчёте на то, что авось куда-то попадём? Ню-ню...
А потом подумай. Большая часть динамической памяти -- это как раз действительные экземпляры и обрывки экземпляров объектов.
И как тут твоё "маловероятно"?
> или вообще за пределы адресного пространства?
>
> а вот это интересно. Как можно сослаться за пределы адресного
> пространства? Вроде как адреснео пространство 4 гигабайта.
> И указатель это четырехбайтовое целое, которые как раз может
> указывать в любом диапазоне от 0 до 4-х гигабайт. Как он
> может указывать за адресное пространство?
Уймись, ламерок.
За одно твоё предложение тыкать куда попало по мусорному указателю тебя надо подвергать эвтаназии.
← →
Григорьев Антон © (2004-07-14 16:56) [121]
> Тимохов © (14.07.04 16:39) [113]
> прикольно - обсуждение разделилось на 3 лагеря.
>
> 1. is работате верно - DimondShark
> 2. is работает верно, но неверно сделана дока - я
> 3. is работает неверно - piter.
>
> :))))
Ха-ха! А я ни в один из этих лагерей не попал - см. [119]
← →
DiamondShark © (2004-07-14 16:57) [122]
> Тимохов © (14.07.04 16:48) [116]
Интересно, а от оператора "+" вы какой семантики ждёте?
Будете тоже громко протестовать, что строка
a := 1 + 2;
компилируется в
mov EAX, 3
или как?
← →
Sergey Kamininski (2004-07-14 16:58) [123]Кстати, помните первый пост:
Вылавливал баг в своей программе и обнаружил интереснейшую вещь. Окаывается, оператор IS вызывает Acees Violation при определенных условиях!
При таком подходе этаких "БАГОВ" будет - ой.
;)
← →
DiamondShark © (2004-07-14 17:01) [124]
> Тимохов © (14.07.04 16:39) [113]
Кстати, а откуда вы взяли, что is работает верно, если дока, по-вашему, написана неверно? Что-то тут с логикой не то...
← →
Тимохов © (2004-07-14 17:04) [125]
> Григорьев Антон © (14.07.04 16:51) [119]
> Не соответсвует - и всё тут. Без дальнейших комментариев.
На все сто (в смысле согласен)
← →
Anatoly Podgoretsky © (2004-07-14 17:05) [126]Var Type of TButton is TButton не требует проверки в run time, кроме проверки на nil, а вот Var of other Type TButton is TButton требует
← →
Тимохов © (2004-07-14 17:05) [127]
> DiamondShark © (14.07.04 17:01) [124]
>
> > Тимохов © (14.07.04 16:39) [113]
>
> Кстати, а откуда вы взяли, что is работает верно, если дока,
> по-вашему, написана неверно? Что-то тут с логикой не то...
вы типа пост, похоже не целиком читали.
почему я считаю, что is работает верно я наверное раз 5 объяснял :)))
← →
Тимохов © (2004-07-14 17:07) [128]
> DiamondShark © (14.07.04 17:01) [124]
А в оббщем я уже соглсился с утвержденем Антона Григорьева: "Не соответсвует - и всё тут. Без дальнейших комментариев."
Для меня это есть личный вывод из топика.
Т.е. считайте, что я несколько изменил свое мнение в сторону универсальности. Трактуйте как хотите. :))))
← →
Piter © (2004-07-14 17:16) [129]Удалено модератором
Примечание: Намеки на умственное развитие допустимы по отношению к автору ветки и недопустимы автором
← →
Sandman25 © (2004-07-14 17:16) [130]
type
Boolean = (False, True, Null);
TSuperObject = class
private
FIsAlive: Boolean;
public
property IsAlive: Boolean read FIsAlive;
constructor Create;
destructor Destroy; override;
function IsClass(AClass: TClass): Boolean;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Super: TSuperObject;
begin
Super := nil;
ShowMessage(IntToStr(Ord(Super.IsClass(TSuperObject))));
Super := TSuperObject.Create;
ShowMessage(IntToStr(Ord(Super.IsClass(TSuperObject))));
Super.Free;
ShowMessage(IntToStr(Ord(Super.IsClass(TSuperObject))));
end;
{ TSuperObject }
constructor TSuperObject.Create;
begin
FIsAlive := True;
end;
destructor TSuperObject.Destroy;
begin
FIsAlive := False;
end;
function TSuperObject.IsClass(AClass: TClass): Boolean;
begin
if Assigned(Self) then
if (IsAlive = True)then
Result := Boolean(Self is AClass)
else
Result := Null
else
Result := Null
end;
Показывает 2 (Null - объект еще не создан), 1 (True - объект создан и доступен), 2 (Null - объект был создан, а затем уничтожен).
Во избежание AV следует заменить Result := Boolean(Self is AClass)
на
try
Result := Boolean(Self is AClass)
except
Result := Null
end;
← →
DiamondShark © (2004-07-14 17:20) [131]
> Тимохов © (14.07.04 17:07) [128]
Какой такой универсальности?
← →
Тимохов © (2004-07-14 17:20) [132]
> А знаешь, чтобы тебе копать в этой области - тебе тоже не
> мешает изучить представленные тобой же материалы.
я привел материалы, которые изучил сам
они мне позволяют отвечать на твои возражения про везение.
Причем здесь значок?
Моя позиция однозначно и непоколебимо закреплена в 128.
Что же делать, если сменил задумался о чем-то и пришлось изменить свое мнение? На то он и форум.
← →
Тимохов © (2004-07-14 17:22) [133]
> Какой такой универсальности?
Процитирую слова Антона Григорьва из 119
"И, более того, считаю вредным выяснять, то ли поведение правильное, а описание нет, то ли, наоборот, описание правильное, а поведение - нет".
Т.е. универсальность в том, чтобы не выносить суждения в той области, где правдны не найдешь - сколько людей, столько и мнений.
← →
ИдиотЪ (2004-07-14 17:24) [134]всем сомневающимся насчет is - пользуйтесь своей версией и тогда может быть лет через 10 Borland признает ваши нелегкие начинания!
← →
Григорьев Антон © (2004-07-14 17:24) [135]
> а вот это интересно. Как можно сослаться за пределы адресного
> пространства? Вроде как адреснео пространство 4 гигабайта.
> И указатель это четырехбайтовое целое, которые как раз может
> указывать в любом диапазоне от 0 до 4-х гигабайт. Как он
> может указывать за адресное пространство?
Это так называемое виртуальное адресное пространство. Оно разбито на блоки по 4 кб (начиная с Windows 2000 - по 64 кб), и каждый такой блок может:
а) быть сопоставленным с блоком физической памяти;
б) быть сопоставленным с блоком, выгруженным на диск;
в) не быть ни с чем сопоставленным.
Когда указатель указывает на блок типа "в", и мы пытаемся что-то с ним сделать, то возникает AV.
← →
Sergey Kamininski (2004-07-14 17:28) [136]2 [129]
это между прочим не черт знает что, а экземпляр TEdit!
Нет, уважаемый, это никакой не TEdit, а TEdit, приведенный к TButton по твоей настойчивой просьбе. И, говоря иносказательно: "Ты ведь просил компилятор обходиться с TEdit как с TButton -- вот он и исполнил твою просьбу ПОЛНОСТЬЮ". А чего же ты хотел ;)
← →
Piter © (2004-07-14 17:28) [137]DiamondShark © (14.07.04 16:45) [114]
А вы видите в доке обязательство вызвать IsClass?
А вот я вижу проверку на nil.
А что еще означает динамическая проверка?!?!
А вы видите в доке описание, что будет ТОЛЬКО лишь проверка на nil. Вам не кажется, что для этого есть совсем другая функция - assigned? Или для вас абсолютно естесственно, что IS и ASSIGNED делают одно и тоже?
nikkie © (14.07.04 16:51) [118]
Ты чего, уже вернулся из отпуска? Ну и как оно? :)))
← →
Тимохов © (2004-07-14 17:30) [138]
> Piter © (14.07.04 17:28) [137]
> А что еще означает динамическая проверка?!?!
в этом полностью тебя поддерживаю.
а вот тут
> А вы видите в доке описание, что будет ТОЛЬКО лишь проверка
> на nil. Вам не кажется, что для этого есть совсем другая
> функция - assigned? Или для вас абсолютно естесственно,
> что IS и ASSIGNED делают одно и тоже?
имхо тебя не туда понесло.
----------------------------------
Я в патрии Антона Григорьева - is описан неверно! И баста - никаких если, никаких но. Нас уже двое!
← →
DiamondShark © (2004-07-14 17:32) [139]Удалено модератором
Примечание: На три дня, не надо опускаться до такой степени
← →
Anatoly Podgoretsky © (2004-07-14 17:32) [140]Такие вещи голосованием не решаются.
← →
Тимохов © (2004-07-14 17:34) [141]
> DiamondShark © (14.07.04 17:32) [139]
давайте жить дружно!
он же прав про compile time - кое что вырезается на стадии именно компиляции. Ну мы же это и обсуждаем зачем так, типа грубо.
← →
nikkie © (2004-07-14 17:35) [142]>Ты чего, уже вернулся из отпуска? Ну и как оно? :)))
вернулся... хорошо, но мало :))
← →
DiamondShark © (2004-07-14 17:35) [143]
> Piter © (14.07.04 17:28) [137]
Ты непроходимо туп. Сделай полезное дело -- сдохни.
← →
Григорьев Антон © (2004-07-14 17:36) [144]
> DiamondShark © (14.07.04 17:32) [139]
Был бы я модератором - ты бы за такое хамство недельку в R/O посидел.
← →
Sergey Kamininski (2004-07-14 17:43) [145]Встретились, поговорили...
← →
DiamondShark © (2004-07-14 17:45) [146]
> Тимохов © (14.07.04 17:34) [141]
Нет. Это тупое животное должно было умереть сразу, как написало проверку после разрушения экземпляра.
← →
KSergey © (2004-07-14 17:51) [147]> [139] DiamondShark ©
Ты бы лучше написал подробно, почему Тихомонов не прав, когда в ассемблерном коде только проверка на нил.
Подгорецкий хоть написал.
А недоумками обозвать - большого ума не надо.
Уперся, блин, у все тут... Типа умный самый.
PS
Прошу прощения у окружающих, но считаю, что товарисч ведет себя здесь уже совершенно некорректно.
← →
Тимохов © (2004-07-14 17:51) [148]
> DiamondShark © (14.07.04 17:45) [146]
дело ваше...
← →
Тимохов © (2004-07-14 17:52) [149]
> Ты бы лучше написал подробно, почему Тихомонов не прав
а это кто такой? Я? :)))
Лучше уж вы напишите, в чем я не прав.
От товрисча конструктива похоже не дождешься
← →
Piter © (2004-07-14 17:53) [150]Григорьев Антон © (14.07.04 16:51) [119]
> А вот тебя не смущает, что "ЛОГИЧНЫЙ" Is вернет TRUE в этом
> случае? Не кажется, что логика программы может пойти неправильным
> путем? Ибо указатель на хрен знает что признается указателем
> на TButton?
Если указатель указывает непонятно на что, то результат любых операций над ним непредсказуем. Это следует из внутреннего представления указателя в Delphi. Можно было бы выбрать другое внутреннее представление, защищающее от таких ошибок, но это привело бы к уменьшению гибкости и быстродействи
Э-э-э, Антон, тебя не туда понесло. Я и не говорил, что IS должна работать корректно, если объект уничтожен.
Я про то, что если:var sc: TSameClass
...
sc := Pointer(5555);
if sc is TSameClass
так вот я за то, чтобы здесь был AV.
А Sergey Kaminski утверждает, что существующее поведение правильно и что так и надо, что оператор IF выполнится.
Григорьев Антон © (14.07.04 16:51) [119]
И, более того, считаю вредным выяснять, то ли поведение правильное, а описание нет, то ли, наоборот, описание правильное, а поведение - нет. Не соответсвует - и всё тут. Без дальнейших комментариев
Согласен. И вредно потому, что как я понял это будет вечный флейм. Короче, мы придумали новую Hole WarL
Intel vs AMD
Windows vs UNIX
Delphi vs VC++
...
IS vs Корректность :)
Григорьев Антон © (14.07.04 16:51) [119]
И советую подумать над такой проблемой: как можно в принципе реализовать то, чтобы после Free is или любое другое действие гарантированно бы приводило к AV
зачистка памяти. То есть, обнуление памяти, где распологался объект. А не просто объявление этой памяти свободной.
DiamondShark © (14.07.04 16:53) [120]
А потом подумай. Большая часть динамической памяти -- это как раз действительные экземпляры и обрывки экземпляров объектов.
И как тут твоё "маловероятно"?
Да-а-а? Адресное пространство 4 гигабайта. Большая часть памяти - это как минимум больше половины. То есть, более двух гигабайт занято обрывками классов? Гы... увольте
Уймись, ламерок.
За одно твоё предложение тыкать куда попало по мусорному указателю тебя надо подвергать эвтаназии
Строго прошу тебя, DiamondShark, больше в эту ветку не заходить. Да, это твое право писать сюда, ветка - часть форума. Но я тебя прошу как человека больше сюда не заглядывать.
Заранее спасибо.
Тимохов © (14.07.04 17:20) [132]
Что же делать, если сменил задумался о чем-то и пришлось изменить свое мнение? На то он и форум
я бы сказал на то она и жизнь. Я вообще считаю абсолютно нормальным, что человек меняет свою точку зрения, лишь бы это не происходило бы очень часто. Гораздо лучше исправить свое мнение на верное, чем бычить и остаивать СВОЕ, но неверное мнение...
Григорьев Антон © (14.07.04 17:24) [135]
а-а-а, понял. Спасибо за разъяснение - я это знаю. Просто под адресным пространством у меня ассоциируется ВАП. Наверное, это неправильно.
Sergey Kamininski (14.07.04 17:28) [136]
Нет, уважаемый, это никакой не TEdit, а TEdit, приведенный к TButton по твоей настойчивой просьбе
А чем внутренне отличается TEdit "натуральный" от TEdit приведенного? :)) У него что, какие-то поля не так заполнены, вообще, он хоть байтом будет отличаться от приведенного? :) Собственно говоря, приводят не сами внутренние структуры компонентов (это было бы невозможно), а просто ссылки на них. А ссылка - это что? Обычное 4-х байтовое целое.
← →
Piter © (2004-07-14 17:55) [151]Я был о DiamondShark лучшео мнения... да, жаль.
← →
Тимохов © (2004-07-14 17:56) [152]
> зачистка памяти. То есть, обнуление памяти, где распологался
> объект. А не просто объявление этой памяти свободной.
Не гони. К тому же ничего не мешает это тебе реализовать самому. Почитай TObject.FreeInstance. Нет проблем:)
← →
app © (2004-07-14 17:56) [153]Все ветку закрываю, так как пошла личная перепалка
Страницы: 1 2 3 4 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.82 MB
Время: 0.048 c