Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-1089700051
menart
2004-07-13 10:27
2004.08.01
Тестирования секретарей


10-1019627903
denis_1
2002-04-24 09:58
2004.08.01
DCOM


6-1086093802
BDyatel
2004-06-01 16:43
2004.08.01
При дисконекте клиента не уменьшается кол-во активных соеденений


6-1084508226
NLO
2004-05-14 08:17
2004.08.01
ICQ


3-1089375927
Sergey_
2004-07-09 16:25
2004.08.01
Время из TimeStamp





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский